运行c ++代码时出现分段错误

时间:2014-08-03 13:16:46

标签: c++ opencv segmentation-fault

前段时间,我问了一个关于堆栈溢出的问题,关于如何在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;
}

1 个答案:

答案 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