前段时间,我问了一个关于堆栈溢出的问题,关于如何在linux中使用c ++捕获快速截图。我使用g++ main.cpp -std=c++0x -o app 'pkg-config --cflags --libs openCV'
编译了该代码(如下所示)。它编译成功,但是,当我尝试运行程序时,它会导致分段错误。我对c ++和openCV很陌生,所以我真的不知道该怎么做。我的代码或其他东西是错误的吗?
如果我错过了解决此错误所需的详细信息,我很抱歉,如果我这样做,请通过评论告诉我。
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <cstdint>
#include <cstring>
#include <vector>
#include "/usr/local/include/opencv2/opencv.hpp"
using namespace cv;
void ImageFromDisplay(std::vector<uint8_t>& Pixels, int& Width, int& Height, int& BitsPerPixel)
{
Display* display = XOpenDisplay(nullptr);
Window root = DefaultRootWindow(display);
XWindowAttributes attributes = {0};
XGetWindowAttributes(display, root, &attributes);
Width = attributes.width;
Height = attributes.height;
XImage* img = XGetImage(display, root, 0, 0 , Width, Height, AllPlanes, ZPixmap);
BitsPerPixel = img->bits_per_pixel;
Pixels.resize(((((Width * Height) + 31) & ~31) / 8) * Height);
memcpy(&Pixels[0], img->data, Pixels.size());
XFree(img);
XCloseDisplay(display);
}
int main()
{
int Width = 0;
int Height = 0;
int Bpp = 0;
std::vector<std::uint8_t> Pixels;
ImageFromDisplay(Pixels, Width, Height, Bpp);
if (Width && Height)
{
Mat img = Mat(Height, Width, Bpp > 24 ? CV_8UC4 : CV_8UC3, &Pixels[0]); //Mat(Size(Height, Width), Bpp > 24 ? CV_8UC4 : CV_8UC3, &Pixels[0]);
namedWindow("WindowTitle", WINDOW_AUTOSIZE);
imshow("Display window", img);
waitKey(0);
}
return 0;
}
答案 0 :(得分:0)
假设有width * height
像素,每个像素都有bits_per_pixel
位。然后img-&gt;数据包含(width * height * bits_per_pixel) / CHAR_BIT
个字节。
但是你试图从(width * height * height) / 8
中读取(大约)img->data
这是没有意义的。
将其更改为(width * height * bits_per_pixel) / CHAR_BIT
。