C++ OpenCV:在QImage上使用GaussianBlur或Sobel导数

C++ OpenCV:在QImage上使用GaussianBlur或Sobel导数,c++,qt,opencv,C++,Qt,Opencv,我希望你能帮助我 我正在使用QT并尝试在图像上做一个简单的边缘检测。但我的程序启动时崩溃了 cv::GaussianBlur( src, src, cv::Size(3,3), 0, 0, cv::BORDER_DEFAULT ); 或 这是我的密码: QImage *image1; IplImage *cv_image1; image1 = new QImage("./image.png"); // Format is ARGB32 cv_image1 = QIm

我希望你能帮助我

我正在使用QT并尝试在图像上做一个简单的边缘检测。但我的程序启动时崩溃了

cv::GaussianBlur( src, src, cv::Size(3,3), 0, 0, cv::BORDER_DEFAULT );

这是我的密码:

QImage      *image1;    
IplImage    *cv_image1;

image1 = new QImage("./image.png");  // Format is ARGB32
cv_image1 = QImage2IplImage(image1);
cv::Mat src(cv_image1);

cv::imshow(window_name, src); // Work Well
cv::Mat src_gray;
int scale = 1;
int delta = 0;
int ddepth = CV_16S;

cv::GaussianBlur(src, src, cv::Size(3,3), 0, 0, cv::BORDER_DEFAULT); //Crash Here
cv::imshow( window_name, src);
我认为这是一个格式问题。 但是在另一个使用ARGB32中的QIMAGES的程序中,该代码运行良好。
谢谢。

尝试使用此函数进行正确的QImage到cv::Mat的转换,您应该会没事的(我还包括了从cv::Mat到QImage的转换):

我找到了解决办法。 这很奇怪,但当我这么做的时候:

cvtColor(src, src_gray, CV_RGB2GRAY );
cv::Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, cv::BORDER_CONSTANT);

没有cv::GaussianBlur,它工作得很好。我只是将最后一个参数改为cv::BORDER_CONSTANT

,感谢这种转换方法。但这并没有解决我的问题。我将尝试将OpenCV添加到我的项目的干净版本。当代码崩溃时,您收到的确切消息是什么?好的,我在QTCreator的应用程序输出中收到“退出,代码为-1073741819”。
cv::Mat cvmat_from_qimage(const QImage& qimage)
{ 
    cv::Mat mat = cv::Mat(qimage.height(), qimage.width(), CV_8UC4, (uchar*)qimage.bits(), qimage.bytesPerLine()); 
    cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3 ); 
    int from_to[] = { 0,0,  1,1,  2,2 }; 
    cv::mixChannels( &mat, 1, &mat2, 1, from_to, 3 ); 
    return mat2; 
}

QImage qimage_from_cvmat(const cv::Mat& mat)
{ 
    cv::Mat rgb; 
    cvtColor(mat, rgb, CV_BGR2RGB); 
    return QImage((const unsigned char*)(rgb.data), rgb.cols, rgb.rows, QImage::Format_RGB888); 
}
cvtColor(src, src_gray, CV_RGB2GRAY );
cv::Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, cv::BORDER_CONSTANT);