• opencv学习——兴趣区选取


    在OpenCV中,普遍支持ROI和widthStep,函数的操作被限制于感兴趣的区域,要设置或者取消ROI,就要使用cvSetImageROI()和cvResetImage()函数.如过想设置ROI,可以使用函数cvSetImageROI(),并为其传递一个图像指针和矩形.而取消ROI,只需要为函数cvResetImageROI()传递一个图像指针

    void  cvSetImageROI( IplImage* image, CvRect rect );

    void  cvResetImageROI( IplImage* image );

    如例3.12,读取一幅图像,并设置了想要的ROI的x,y,width,和height的值,最后将ROI区域都加上了一个整数,本例程中,通过内联的cvRrect()构造函数设置ROI.通过cvResetIMageROI()函数释放ROI是非常重要的,否则将忠实的显示ROI区域

    1. //例3.12 用imageROI来增加某范围的像素  
    2. #include "stdafx.h"  
    3. #include <cv.h>  
    4. #include <highgui.h>  
    5. int _tmain(int argc, _TCHAR* argv[])  
    6. {  
    7.     IplImage* src;  
    8.     src = cvLoadImage("C:/Users/Administrator/Desktop/lena.bmp");  
    9.     if (src != nullptr)  
    10.     {  
    11.         int x = 20;  
    12.         int y = 20;  
    13.         int width = 150;  
    14.         int height = 150;  
    15.         int add = 150;  
    16.         cvSetImageROI(src,cvRect(x,y,width,height));  
    17.         cvAddS(src,cvScalar(add),src);  
    18.         cvResetImageROI(src);  
    19.         cvNamedWindow("ROI_add",1);  
    20.         cvShowImage("ROI_add",src);  
    21.         cvWaitKey();  
    22.     }  
    23.     return 0;  
    24. }  

    通过巧妙地使用widthStep,我们可以打到同样的效果.要做到这一点,我们创建了另一个图像头,让他的width和height的值等于interest_rect的width和height的值.我们还需要按interest_rect 起点设置图像起点(左上角或者左下角),下一步,设置子图像的widthStep与较大的interest_img相同.这样,即可在子图像中逐步步进到大图像里子区域中下一行开始处的合适位置.最后设置子图像的imageData指针指向兴趣子区域的开始,如下例所示

    1. IplImage *interest_img;  
    2. CvRect interest_rect;  
    3. IplImage* sub_img = cvCreateImageHeader(cvSize(interest_rect.width,interest_rect.height),  
    4.     interest_img->depth,interest_img->nChannels);  
    5. sub_img->origin = interest_img->origin;  
    6. sub_img->widthStep = interest_img->widthStep;  
    7. sub_img->imageData = interest_img->imageData +  
    8.     interest_rect.y * interest_img->widthStep +  
    9.     interest_rect.x * interest_img->nChannels;  
    10. cvAddS(sub_img,cvScalar(1),sub_img);  
    11. cvReleaseImageHeader(&sub_img);  
    看起来设置和重置ROI更方便一些,为什么还要使用widthStep? 原因是有些时候在处理的过程中,想在操作过程中设置和保持一副图像的多个子区域处于活动状态,但是ROI只能串行处理并且必须不断的设置和重置.

    掩码和模版, 在代码示例中cvAddS()函数允许第四个参数默认值为空:const CvArr* mask = NULL.这是一个8位单通道数组,它允许把操作限制到任意形状的非0像素和掩码区,如果ROI随着掩码或者模版变化,进程将会被限制在ROI和掩码的交集区域.掩码或者模版只能在指定了其图像的函数中使用.

  • 相关阅读:
    微信公众号开发的时候code失效的问题
    微信公众平台测试号通过网页授权获取用户的信息
    做了一些mysql的习题 感觉用来应付面试是足够了
    springMVC在使用重定向跳转
    jsp获取标签数据
    再来一次atm机 用文本做的
    django mysql数据库配置
    django url控制器
    django初始要做的事情
    flask学习
  • 原文地址:https://www.cnblogs.com/nktblog/p/4027136.html
Copyright © 2020-2023  润新知