【问题标题】:Define image ROI with OpenCV in C在 C 中使用 OpenCV 定义图像 ROI
【发布时间】:2012-05-24 19:43:22
【问题描述】:

我有一个关于如何使用 OpenCV 定义 ROI 的问题。我知道函数cvSetImageROI 的定义是什么,但我想知道是否可以使用形状与矩形不同的 OpenCV 定义 ROI。例如,以圆形或其他形式定义 ROI。

可以这样做吗?

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

【问题讨论】:

    标签: c opencv roi


    【解决方案1】:

    以下代码(您可以找到 here 甚至 here)使用图像上的位掩码设置圆形 ROI。

    #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;
    }
    

    对于五边形或六边形,只需调整它以改变面具的几何形状。检查这个 SO 问题:Using ROI in OpenCV?

    【讨论】:

      【解决方案2】:

      您应该使用遮罩来模拟非矩形 ROI。

      【讨论】:

      • 没错。我想定义一个不同的形状,比如五边形或六边形。
      • 有没有可能使用类似于切片但不规则形状的东西?我问这个是因为使用掩码和按位运算创建的 ROI 更耗时。例如,使用timeit 我得到以下输出CROP TIMING: 11560.400000007576 us,而ROI TIMING: 780580.8000000524 us 使用10000 迭代进行测试
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2019-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多