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.

  • 相关阅读:
    IDEA设置显示行号和方法间的分隔符
    IDEA设置自动导包功能
    IDEA设置设置鼠标滚轮修改字体大小
    CA数字证书部署
    mysql数据库基础
    部署集群基础环境,MySQL-MMM架构部署,MySQL-MMM架构使用
    使用binlog日志, XtraBackup备份工具 ,MySQL AB复制
    实现MySQL读写分离,MySQL性能调优
    密码恢复及设置,用户授权及撤销,MySQL管理工具
    SQL数据导入/导出,操作表记录,查询及匹配条件
  • 原文地址:https://www.cnblogs.com/xiangshancuizhu/p/2250931.html
Copyright © 2011-2022 走看看