Не могу получить результат с помощью cvCornerHarris () - PullRequest
3 голосов
/ 28 июня 2011

Я просто хочу попробовать функцию openCV - cvCornerHarris.Вот мой код на C ++:

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

Я могу получить ожидаемое выходное изображение cvCanny (cannyImg), но выходное изображение cvCornerHarris (harrisImg) - черное изображение без чего-либов теме.Пожалуйста, помогите объяснить, как использовать эту функцию cvCornerHarris.Спасибо!

1 Ответ

5 голосов
/ 28 июня 2011

Все дело в параметрах! Люди склонны полагать, что существуют магические параметры, которые будут работать для всех типов изображений и сценариев. К сожалению, этого не происходит в реальном мире.

Параметры, используемые для обработки одного изображения, могут не давать такой же уровень результатов при применении к другому типу изображения. Теперь рассмотрим следующий код:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...