OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI

一.ROI介绍 在OpenCV中我们能够非常方便地获取指定ROI区域的子图像。如果你对图像设置了ROI,那么,Opencv的大多数函数只在该ROI区域内运算(只处理该ROI区域),如果没设ROI的话,就会出来整幅图像。
ROI非常有用,例如我们想把图像中的人脸扣出来,进行人脸识别。需要注意的时候,ROI一定在图像内部,而不能超出图像的范围。

对图像设定ROI的函数是:

cvSetImageROI(IplImage* src,CvRect rect);
src表示的是源图像,rect只的是ROI区域。

如果要取消ROI区域,那么使用函数:

cvResetImageROI(IplImage* src);
这个函数,就把src上的ROI区域取消掉。
图像的剪切有多种措施,其中利用ROI的措施
第一步:将必需剪切的图像图像不局部设置为ROI cvSetImageROI(src , cvRect(x,y,width,height));
第二步:修建一个与必需剪切的图像局部同样大小的新图像 cvCreateImage(cvSize(width,height),IPL_DEPTH,nchannels);
第三步:将源图像复制到修建的图像中 cvCopy(src,dst,0);
第四步:释放ROI区域 【OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI】cvResetIamgeROI(src);
缩放可用cvResize();
二.图像分割 [cpp]view plain copy

  1. // Cut_image.cpp : 定义控制台应用程序的入口点。
  2. //
  3. /***********************************************************************
  4. * OpenCV 2.4.4 测试例程
  5. * 杜健健 提供
  6. ***********************************************************************/
  7. #include "stdafx.h"
  8. #include
  9. #include
  10. #include
  11. #include
  12. #include
  13. using namespace std;
  14. using namespace cv;
  15. //剪切图片为m * n 块
  16. void Cut_img(Mat src_img,int m,int n,Vector ceil_img){
  17. int t = m * n;
  18. int height = src_img.rows;
  19. int width= src_img.cols;
  20. int ceil_height = height/m;
  21. int ceil_width= width/n;
  22. Mat roi_img,tmp_img;
  23. Point p1,p2;
  24. for(int i = 0; i
  25. for(int j = 0; j
  26. //p1 =
  27. Rect rect(i+j*ceil_width,j+i*ceil_height,ceil_width,ceil_height);
  28. src_img(rect).copyTo(roi_img);
  29. ceil_img.push_back(roi_img);
  30. imshow("roi_img",roi_img);
  31. //getchar();
  32. waitKey(0);
  33. //rectangle(i+j*ceil_width,j+i*ceil_height,);
  34. }
  35. }
  36. void show_images(Vector imgs,int n){
  37. //do something
  38. }
  39. int _tmain(int argc, _TCHAR* argv[])
  40. {
  41. Mat img = imread("D://input//lena.jpg",1);
  42. imshow("src img",img);
  43. int m = 3;
  44. int n = 3;
  45. Vector ceil_img = m*n;
  46. Cut_img(img,m,n,ceil_img);
  47. waitKey();
  48. return 0;
  49. }
三.示例结构 原图:
OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片


切割后的图:
OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片
OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片
OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片


OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片
OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片
OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片


OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片
OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片
OpenCV学习笔记|学习opencv之(六)-图像切割,使用ROI
文章图片


四.总结 根据切割的块数,计算小图片尺寸大小,存放到vector容器里,要的时候再读取出来就可以了。没用到opencv的ROI,但也可以使用。
五.参考 http://www.opencvchina.com/thread-228-1-1.html

    推荐阅读