2012-05-17 5 views
4

У меня вопрос о том, как определить ROI с OpenCV. Я знаю, что определение функции cvSetImageROI, но я хочу знать, можно ли определить ROI с OpenCV с другой формой, чем прямоугольник. Например, определите ROI в круге или в другой форме.Определить изображение ROI с OpenCV в C

Это можно сделать?

cvSetImageROI (img1, cvRect (a, b, c, d));

ответ

3

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

#include "cv.h" 
#include "highgui.h" 

int main(int argc, char** argv) 
{ 
    IplImage* src, * res, * roi; 

    /* usage: <prog_name> <image> */ 
    if (argc < 2) 
    { 
     fprintf(stderr, "Usage: %s <image>\n", argv[0]); 
     return 1; 
    } 

    src = cvLoadImage(argv[1], 1); 
    res = cvCreateImage(cvGetSize(src), 8, 3); 
    roi = cvCreateImage(cvGetSize(src), 8, 1); 

    /* prepare the 'ROI' image */ 
    cvZero(roi); 

    /* Note that you can use any shape for the ROI */ 
    cvCircle(
     roi, 
     cvPoint(130, 100), 
     50, 
     CV_RGB(255, 255, 255), 
     -1, 8, 0 
    ); 

    /* extract subimage */ 
    cvAnd(src, src, res, roi); 

    /* 
    * do the main processing with subimage here. 
    * in this example, we simply invert the subimage 
    */ 
    cvNot(res, res); 

    /* 'restore' subimage */ 
    IplImage* roi_C3 = cvCreateImage(cvGetSize(src), 8, 3); 
    cvMerge(roi, roi, roi, NULL, roi_C3); 
    cvAnd(res, roi_C3, res, NULL); 

    /* merge subimage with original image */ 
    cvNot(roi, roi); 
    cvAdd(src, res, res, roi); 

    /* show result */ 
    cvNamedWindow(argv[1], 1); 
    cvNamedWindow("res", 1); 
    cvShowImage(argv[1], src); 
    cvShowImage("res", res); 

    cvWaitKey(0); 

    /* be tidy */ 
    cvDestroyAllWindows(); 
    cvReleaseImage(&src); 
    cvReleaseImage(&res); 
    cvReleaseImage(&roi); 

    return 0; 
} 

Для пятиугольника или шестиугольника просто приспособите его так, чтобы изменить геометрическую форму маски. Проверьте этот вопрос: Using ROI in OpenCV?.

1

Вы должны использовать маски для имитации непрямоугольного ROI.

+0

Точно. Я хочу определить другую форму, такую ​​как пятиугольник или шестиугольник. – edsonlp1

1

Ниже приведен код Circular ROI. Однако, чтобы перейти к другой форме, просто замените функцию CvCircle() другой формой. cvAnd(src, src, res, roi); - самая важная функция маскирования.

//(c) 2012 enthusiasticgeek for Stack overflow 
#include "cv.h" 
#include "highgui.h" 

#define REQUIRED_RADIUS (100) 

int main(int argc, char** argv) 
{ 
    IplImage* src, * res, * roi; 

    /* usage: <prog_name> <image> */ 
    if (argc < 2) 
    { 
     fprintf(stderr, "Usage: %s <image>\n", argv[0]); 
     return 1; 
    } 

    src = cvLoadImage(argv[1], 1); 
    cvSetImageROI(src,cvRect(src->width/2-REQUIRED_RADIUS, src->height/2-REQUIRED_RADIUS,REQUIRED_RADIUS*2,REQUIRED_RADIUS*2)); 
    res = cvCreateImage(cvGetSize(src), 8, 3); 
    roi = cvCreateImage(cvGetSize(src), 8, 1); 

    /* prepare the 'ROI' image */ 
    cvZero(roi); 
    cvZero(res); 

    /* Note that you can use any shape for the ROI */ 
    cvCircle(
     roi, 
     cvPoint(REQUIRED_RADIUS,REQUIRED_RADIUS),//src->width/2, src->height/2), 
     REQUIRED_RADIUS, 
     CV_RGB(255, 255, 255), 
     -1, 8, 0 
    ); 

    /* extract subimage */ 
    cvAnd(src, src, res, roi); 


    /* show result */ 
    cvNamedWindow("res", 1); 
    cvShowImage("res", res); 

    cvWaitKey(0); 

    /* be tidy */ 
    cvDestroyAllWindows(); 
    cvReleaseImage(&src); 
    cvReleaseImage(&res); 
    cvReleaseImage(&roi); 

    return 0; 
} 
Смежные вопросы