首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV:在QImage上使用GaussianBlur或Sobel派生函数

OpenCV:在QImage上使用GaussianBlur或Sobel派生函数
EN

Stack Overflow用户
提问于 2012-06-13 23:29:14
回答 2查看 6.9K关注 0票数 2

我希望你能帮助我。

我正在使用QT,并尝试对图像进行简单的边缘检测。但是当我启动时我的程序崩溃了

代码语言:javascript
复制
cv::GaussianBlur( src, src, cv::Size(3,3), 0, 0, cv::BORDER_DEFAULT );

代码语言:javascript
复制
cv::Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, cv::BORDER_DEFAULT );

下面是我的代码:

代码语言:javascript
复制
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的另一个程序中,这段代码工作得很好。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-15 15:40:13

我找到了一个解决方案。这很奇怪,但当我这样做的时候:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2012-06-14 15:15:10

尝试使用此函数将适当的QImage转换为cv::Mat,就可以了(我还包含了一个从cv::Mat到QImage的转换):

代码语言:javascript
复制
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); 
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11018290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档