2012-06-13 66 views
2

我希望你能幫助我。OpenCV:在QImage上使用GaussianBlur或Sobel衍生物

我正在使用QT,並嘗試做一個簡單的圖像邊緣檢測。但是,當我啓動

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

cv::Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, 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的程序中,此代碼運行良好。 謝謝。

回答

0

我找到了解決辦法。 那是奇怪的,但是當我做:

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

沒有CV ::高斯模糊效果很好。我只是將最後一個參數更改爲cv :: BORDER_CONSTANT

3

嘗試用正確的QImage將簡歷::墊轉換使用此功能,你應該罰款(我還包括來自CV轉換::墊的QImage):

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); 
} 
+0

感謝這種轉換方法。 但它並沒有解決我的問題。 我會重試將OpenCV添加到我的項目的乾淨版本。 –

+0

當您的代碼崩潰時,您收到的確切消息是什麼? – dom

+0

好的,我在QTCreator的Application Output中收到「退出代碼-1073741819」。 –