在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和掩码的交集区域.掩码或者模版只能在指定了其图像的函数中使用.

opencv学习——兴趣区选取的更多相关文章

  1. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  2. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  3. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  4. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

  5. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  6. OpenCV学习笔记之课后习题练习3-5

    OpenCV学习笔记之课后习题练习2-5 练习使用感兴趣区域(ROI).创建一个210*210的单通道图像并将其归0.在图像中使用ROI和cvSet()建立一个增长如金字塔状的数组. 参考博文:www ...

  7. OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建

    # OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-hom ...

  8. opencv学习笔记D01

    目录 opencv学习笔记D01 一.图片读取 二.图片保存 三.图片展示 四.图片缩放 五.四种常用插值方式的比较 1.最近邻插值 2.双线性插值 3.区域插值 4.三次样条插值 我是尾巴: ope ...

  9. opencv学习笔记(七)SVM+HOG

    opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...

随机推荐

  1. Linux下dig命令使用

    Dig简介:   Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具.由于一直缺失Dig man page文档,本文就权当一个dig使用向导吧.   Dig的 ...

  2. android学习笔记九——RatingBar

    RatingBar==>星级评分条 RatingBar和SeekBar十分相似,它们甚至有相同的父类:AbsSeekBar.两者都允许用户通过拖动来改变进度: 两者最大的区别在于RatingBa ...

  3. 启动Memcache,出现memcached: error while loading shared libraries: libevent-1.4.so.1: cannot open shared

      1.有可能是装了多个 libevent而导致memcache无法识别哪一个,解决方法就是卸载掉一个libevent 2.只安装了一个libevent,但是也报这个错,解决方法 32位系统下:ln ...

  4. purgeIdleCellConnections: found one to purge conn = 0x1e09f7d0

    purgeIdleCellConnections: found one to purge conn = 0x1e09f7d0 你在iOS6下使用3G网络时可能会遇到这条log,不用紧张,这只是苹果的工 ...

  5. 探秘JavaScript中的六个字符

    JavaScript 是一个奇怪而有趣的语言,我们可以写一些疯狂却仍然有效的代码.它试图帮助我们把事情转换到基于我们如何对待他们的特定类型. 如果我们添加一个字符串,JavaScript会假定我们希望 ...

  6. Service代码示例

    package com.homily.training.service; import android.app.Service; import android.content.Intent; impo ...

  7. java_ _反射

    Java语言的反射机制初步学习 首先看下基本概念: (一)在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取 ...

  8. Linux设置服务自启动(转载)

    From:http://www.cnblogs.com/nerxious/archive/2013/01/18/2866548.html 有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统 ...

  9. 8 个 Git 的小技巧

    git 已经成为了我日常必备工具之一,我总结我几乎每天使用的8个有用(且简洁)的git技巧.   使用-p选择性添加 当你想提交内容时,你可以通过使用 git commit -am 来选择所有文件或使 ...

  10. VMware虚拟机的CentOS无法上网的解决方法

    前言:由于Linux下很多软件安装必须网络环境下进行,因此,对于如何在VMware下进行上网,我折腾了至少三天,今天上午,也即五一劳动节,终于搜到一遍技术文章,经过自己实践,VMware下Linux的 ...