2011-06-28 19 views
3

openCV関数 - cvCornerHarrisを試してみたいです。その上に何も黒い画像は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)の出力イメージされています。ここに私のC++コードです。 この機能の使用方法をご説明ください。cvCornerHarrisありがとう!

+0

は、我々はあなたがテストのために使用している画像を見つけることができますか? – karlphillip

+1

これまで使用したことのない関数( 'cvCornerHarris')を使用しているようですので、コードの途中で投げたり、すぐに使えると思ったりしないでください。これはヒントです、よろしいですか?怒らないでください。この練習だけでは、コーディングに多くの時間を節約できます。だから、将来的には問題を最小限の例に分け、それを試して他のパラメータをテストするのを恐れないでください。あなたがそれをしていれば、最終的にあなたのためにうまくいく一連のパラメータが見つけられます。 – karlphillip

答えて

5

これはすべてパラメータに関するものです。人々は、あらゆる種類の画像やシナリオで効果的な魔法のパラメータがあると信じがちです。残念ながら、これは現実世界では起こりません。

1つのイメージを処理するために使用されるパラメータが、他のタイプのイメージに適用されたときに同じレベルの結果を生成しないことがあります。さて、次のコードを考えてみましょう。あなたは以下を参照することができたよう

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

関連する問題