不规则ROI

原文:http://blog.csdn.net/xuelin273/article/details/4336064

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.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值