2011-06-28 73 views
3

我只想嘗試openCV函數 - cvCornerHarris。這裏是我的C++代碼:無法獲得使用cvCornerHarris的輸出結果()

//image file 
    char imagePath[256] = "./images/lena512color.tiff"; 
    printf("%s\n", imagePath); 

    IplImage* srcImg = cvLoadImage(imagePath, 1); 
    if(NULL == srcImg){ 
     printf("Can not open image file(s).\n"); 
     return -1; 
    } 
    IplImage* srcImgGry = cvCreateImage(cvGetSize(srcImg), IPL_DEPTH_8U, 1); 
    cvCvtColor(srcImg, srcImgGry, CV_RGB2GRAY); 
    // Canny and Harris expect grayscale (8-bit) input. 
    // And output of harris image must be 32-bit float . 
    IplImage* harrisImg = cvCreateImage(cvGetSize(srcImg), IPL_DEPTH_32F, 1); 
    IplImage* cannyImg = cvCreateImage(cvGetSize(srcImg), IPL_DEPTH_8U, 1); 

    //// Corner detection using Harris-corner 
    cvCornerHarris(srcImgGry, harrisImg, 5, 5, 0.04); 
    cvCanny(srcImgGry, cannyImg, 50, 100, 3); 

    // (5)Display the result 
    cvNamedWindow ("Img", CV_WINDOW_AUTOSIZE); 
    cvShowImage ("Img", srcImgGry); 
    cvNamedWindow ("Harris", CV_WINDOW_AUTOSIZE); 
    cvShowImage ("Harris", harrisImg); 
    cvNamedWindow ("Canny", CV_WINDOW_AUTOSIZE); 
    cvShowImage ("Canny", cannyImg); 
    cvWaitKey (0); 

    cvDestroyWindow ("Harris"); 
    cvDestroyWindow ("Img"); 
    cvReleaseImage (&srcImg); 
    cvReleaseImage (&srcImgGry); 
    cvReleaseImage (&harrisImg); 
    cvReleaseImage (&cannyImg); 

我能得到的cvCannycannyImg)一個預期的輸出圖像但cvCornerHarrisharrisImg)輸出圖像與任何在其上的黑色圖像。 請幫忙解釋如何使用這個功能cvCornerHarris。謝謝!

+0

我們在哪裏可以找到你正在使用的測試圖像? – karlphillip

+1

看起來您正在使用之前從未使用過的函數('cvCornerHarris'),因此請勿將其放在代碼的中間,並期望它可以直接使用。這是一個提示,好嗎?不要生氣。單單這種做法可以爲您節省大量編碼時間。所以在將來,將問題隔離到一個最小的例子,不要害怕玩它並測試其他參數。如果你已經完成了,你最終會找到一組適用於你的參數。 – karlphillip

回答

5

這是關於參數!人們傾向於認爲,存在適用於所有類型圖像和場景的神奇參數。不幸的是,這在現實世界中不會發生。

用於處理一個圖像的參數在應用於其他類型的圖像時可能不會產生相同的結果級別。現在,考慮下面的代碼:

IplImage* colored = cvLoadImage("house.jpg", CV_LOAD_IMAGE_UNCHANGED); 
if (!colored) 
{ 
    printf("Can not open image file(s).\n"); 
    return -1; 
} 

IplImage* gray = cvCreateImage(cvGetSize(colored), IPL_DEPTH_8U, 1); 
cvCvtColor(colored, gray, CV_RGB2GRAY); 

IplImage* harris = cvCreateImage(cvGetSize(colored), IPL_DEPTH_32F, 1); 
cvCornerHarris(gray, harris, 3, 11, 0.07); 

cvNamedWindow("Harris", CV_WINDOW_AUTOSIZE); 
cvShowImage ("Harris", harris); 

正如你可以看到下面,這些參數產生了體面的結果(以我的觀點)。但是,請記住,他們不會爲你工作。如您在測試中觀察到的那樣,錯誤的參數會產生黑色圖像(即不會檢測到任何東西)。

答案是:看看文檔,看看這些參數的含義以及它們如何影響結果。最重要的是,與他們一起玩,直到他們產生滿足您需求的圖像。

輸入圖像:

a_house http://www.123desenhosparacolorir.com/images/house-coloring-pages-2/house-coloring-pages-2.jpg

輸出

harry's_house

+0

非常感謝!我最終得到了一個結果。我試圖找出cvCornerHarris和cvGoodFeaturesToTrack之間的區別。我認爲結果將是角落而不是邊緣的位置。至少我知道我誤解了cvCornerHarris的功能。 – Nauhc

+1

您是否熟悉我們的工作風格?查看所有問題並接受幫助您解決問題的答案。如果此線程中有任何內容,請點擊答案附近的複選框將其選爲此問題的正式答案。 – karlphillip