zoukankan      html  css  js  c++  java
  • opencv不规则ROI——圆形ROI

    A few days ago, a reader asked me about selecting circular ROI using OpenCV. I think such a function for selecting non-rectangular subimage would be useful, so I tried to write one.

     

    OpenCV doesn't provide a function to make non-rectangle ROI, so I use image mask to do the trick. It works like this. say we have two images:

    • img - an RGB image.
    • mask - a black image, with white circle on it.

    We can extract a region from img by:

    res = img & mask

    res now contains a portion from img where the white circle is located.

    Selecting circular ROI and applying some processing on it.
    Fig 1. Selecting circular ROI and applying some processing on it.

    The full listing is shown below. The code loads an image, select circular ROI, and applying some processing on it.

    Listing 1: Extract a circular 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;
    }
    

      In the example above, I only invert the subimage to make it simple. Change the line 39 with more complex image processing.

  • 相关阅读:
    linux下查看nginx,apache,mysql,php的编译参数
    Nginx重大漏洞,文件类型错误解析
    用C语言编写PHP扩展1(转)
    数字证书中keytool命令使用说明
    Nginx 日志文件切割
    推荐12款精心设计网站设计PSD模板
    分享9个最棒的代码片段资源网站
    强大的独立日期选择器(date picker)插件 Kalendae
    分享一个HTML5的drag and drop API实现的图片拖拽分组效果
    你真的很了解HTML标签吗? 试试这个超异类的HTML标签小测验吧!
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2250931.html
Copyright © 2011-2022 走看看