gpt4 book ai didi

c++ - OPENCV C 和 C++ API 的不同结果(边界插值差异)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:26 26 4
gpt4 key购买 nike

我执行了闭合形态学操作,但使用 C 和 C++ API (OpenCV 2.4.2) 得到了不同的结果

输入:

input

使用 OpenCV“C”:

//Set ROI
//Perform Gaussian smoothing
//Perform Canny edge analysis
cvMorphologyEx( src, dst, temp, Mat(), MORPH_CLOSE, 5 );

结果: http://i47.tinypic.com/33e0yfb.png

使用 Opencv C++

//Set ROI 
//Perform Gaussian smoothing
//Perform Canny edge analysis
cv::morphologyEx( src, dst, cv::MORPH_CLOSE, cv::Mat(), cv::Point(-1,-1), 5 );

结果: http://i50.tinypic.com/i5vxjo.png

如您所见,C++ API 产生了带有白色/灰色边框颜色的输出。因此,这两种 API 的结果是不同的。

我尝试过使用 C++ API 的不同 borderType,但它总是产生相同的结果。

如何在 C++ 中获得与 C API 相同的输出?我需要它,因为它会影响检测到的轮廓

提前致谢

最佳答案

谢谢大家回答这个问题。我发现了我的错误。我将在下面简要描述它。希望它能帮助其他面临这个问题的人。

1) 我在 ROI 图像上执行了 C 和 C++ 命令。显然,OpenCV“C”和“C++”API 处理 ROI 的方式不同。

2) 在“C”中,ROI 被视为完全不同的图像。因此,当您执行诸如 cvSmooth、cvDilate 等需要提及边界像素外推方法的函数时,“C”API 不会引用原始图像中超过左/右/顶部/底部像素的像素。它实际上根据您提到的方法对像素值进行插值。

3) 但在“C++”中,我发现对于超出左/右/顶部/底部像素的像素,它总是引用原始图像。因此,如果原始图像中的 ROI 周围有像素,上述边界像素外推方法不会影响您的输出。

我认为它与“C”API 不同,它将顺序像素外推方法应用于原始图像而不是 ROI。我不知道这是不是一个错误;我还没有完全阅读 OpenCV 2.4.2 C++ API 文档。 (如有错误请指正)

为了表示支持,我在下面发布了输入/输出图像:

“C”和 C++ API 的输出:

输入:

input <--- 输入

OpenCV“C”API:

IplImage *src = cvLoadImage("input.png", 0);
cvSetImageROI( src, cvRect(33,19,250,110));
cvSaveImage( "before_gauss.png", src );
cvSmooth( src, src, CV_GAUSSIAN );
cvSaveImage("after_gauss.png", src);
IplConvKernel *element = cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_RECT);
cvCanny( src, src, 140, 40 );
cvSaveImage("after_canny.png", src);
cvDilate( src, src, element, 5);
cvSaveImage("dilate.png", src);

输出:

before_gauss <-- before_gauss

after_gauss <--- 高斯之后

after_canny <--- after_canny

dilate <---扩张

OpenCV“C++”API:

cv::Mat src = cv::imread("input.png", 0);
cv::Mat src_ROI = src( cv::Rect(33,19,250,110));
cv::imwrite( "before_gauss.png", src_ROI );
cv::GaussianBlur( src_ROI, src_ROI, cv::Size(3,3),0 );
cv::imwrite( "after_gauss.png", src_ROI );
cv::Mat element = cv::getStructuringElement( cv::MORPH_RECT, cv::Size(3, 3), cv::Point(1,1));
cv::Canny( src_ROI, src_ROI, 140, 40);
cv::imwrite( "after_canny.png", src_ROI );
cv::dilate( src_ROI, src_ROI, element, cv::Point(1,1), 5);
cv::imwrite( "dilate.png", src_ROI );

输出:

before_gauss <-- before_gauss

after_gauss

^^^^^ after_gauss(注意:边框不再是全黑的,而是灰色的)

after_canny

^^^^^ after_canny

dilate

^^^^^ 膨胀

解决方案:

创建一个单独的 ROI 拷贝并将其用于进一步分析;

src_ROI.copyTo( new_src_ROI ); 

使用 new_src_ROI 进行进一步分析。如果有人有更好的解决方案,请在下面发布

关于c++ - OPENCV C 和 C++ API 的不同结果(边界插值差异),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11768223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com