图像切割,使用ROI

来源:互联网 发布:ubuntu安装 中文语言包 编辑:程序博客网 时间:2024/06/01 07:45

一.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区域

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 <opencv2/opencv.hpp>  
  9.    
  10. #include <opencv2/imgproc/imgproc.hpp>  
  11. #include <opencv2/highgui/highgui.hpp>  
  12. #include <iostream>  
  13. #include <vector>  
  14. using namespace std;  
  15. using namespace cv;  
  16.   
  17.   
  18. //剪切图片为m * n 块  
  19. void Cut_img(Mat src_img,int m,int n,Vector<Mat> ceil_img){  
  20.   
  21.     int t = m * n;  
  22.     int height = src_img.rows;  
  23.     int width  = src_img.cols;  
  24.   
  25.     int ceil_height = height/m;  
  26.     int ceil_width  = width/n;   
  27.   
  28.     Mat roi_img,tmp_img;  
  29.   
  30.     Point p1,p2;  
  31.     for(int i = 0;i<m;i++)  
  32.         for(int j = 0;j<n;j++){  
  33.             //p1 =   
  34.             Rect rect(i+j*ceil_width,j+i*ceil_height,ceil_width,ceil_height);  
  35.   
  36.             src_img(rect).copyTo(roi_img);  
  37.   
  38.             ceil_img.push_back(roi_img);  
  39.             imshow("roi_img",roi_img);  
  40.             //getchar();  
  41.             waitKey(0);  
  42.         //rectangle(i+j*ceil_width,j+i*ceil_height,);  
  43.         }     
  44. }  
  45.   
  46. void show_images(Vector<Mat> imgs,int n){  
  47.        
  48.      //do something  
  49. }  
  50.   
  51. int _tmain(int argc, _TCHAR* argv[])  
  52. {  
  53.     Mat img = imread("D://input//lena.jpg",1);  
  54.     imshow("src img",img);  
  55.     int m = 3;  
  56.     int n = 3;  
  57.     Vector<Mat> ceil_img = m*n;  
  58.   
  59.     Cut_img(img,m,n,ceil_img);  
  60.   
  61.     waitKey();  
  62.     return 0;  
  63. }  




三.示例结构

原图:


切割后的图:




四.总结

根据切割的块数,计算小图片尺寸大小,存放到vector容器里,要的时候再读取出来就可以了。没用到opencv的ROI,但也可以使用。

五.参考

http://www.opencvchina.com/thread-228-1-1.html


转自:http://blog.csdn.net/dujian996099665/article/details/8897077


0 0