簡體   English   中英

與OPENCV C和C ++ API不同的結果(邊界插值差異)

[英]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:

before_gauss < - before_gauss

after_gauss <--- after_gauss

after_canny <--- after_canny

膨脹 <---擴張

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:

before_gauss < - before_gauss

after_gauss

^^^^^ after_gauss (注意:邊框不再是完全黑色,它們是灰色的)

after_canny

^^^^^ 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));

如果需要相同的結果,則應指定所有字段(包括錨點)。

查看OpenCV v2.4.2文檔中的示例代碼 您可能還需要檢查此代碼以使用Canny邊緣檢測器。 這些將有助於您追蹤錯誤:)

另請注意,形態閉合是冪等運算符,因此可以多次應用它而不會將結果更改為初始應用程序之外的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM