![](/img/trans.png)
[英]different result between opencv convertTo in c++ and manual conversion in Python
[英]Different result with OPENCV C and C++ API (Border Interpolation difference)
我已經執行了Closing形態學操作,我得到了與C和C ++ API不同的結果(OpenCV 2.4.2)
輸入:
使用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等函數時,需要提及邊界Pixel外推方法時,'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);
OUTPUT:
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 );
OUTPUT:
^^^^^ after_gauss (注意:邊框不再是完全黑色,它們是灰色的)
^^^^^ after_canny
^^^^^ 擴張
解:
創建單獨的ROI副本並將其用於進一步分析;
src_ROI.copyTo( new_src_ROI );
使用new_src_ROI進行進一步分析。 如果有人有更好的解決方案,請在下面發布
C和C ++之間的默認值不一樣 - 尤其是結構元素。 在C中:默認的結構元素是:
cvCreateStructuringElementEx(3, 3, 1, 1, CV_SHAPE_RECT)
而在C ++中,默認的結構元素是:
getStructuringElement(MORPH_RECT, Size(1+iterations*2,1+iterations*2));
如果需要相同的結果,則應指定所有字段(包括錨點)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.