1. 程式人生 > >學習opencv之(六)-影象切割,使用ROI

學習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區域

cvResetIamgeROI(src);

縮放可用cvResize();

二.影象分割

  1. // Cut_image.cpp : 定義控制檯應用程式的入口點。
  2. //
  3. /***********************************************************************
     
  4.  * OpenCV 2.4.4 測試例程 
  5.  * 杜健健 提供 
  6.  ***********************************************************************/
  7. #include "stdafx.h"
  8. #include <opencv2/opencv.hpp>
  9. #include <opencv2/imgproc/imgproc.hpp>
  10. #include <opencv2/highgui/highgui.hpp>
  11. #include <iostream>
  12. #include <vector>
  13. usingnamespace
     std;  
  14. usingnamespace cv;  
  15. //剪下圖片為m * n 塊
  16. void Cut_img(Mat src_img,int m,int n,Vector<Mat> 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<m;i++)  
  25.         for(int j = 0;j<n;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<Mat> 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<Mat> ceil_img = m*n;  
  46.     Cut_img(img,m,n,ceil_img);  
  47.     waitKey();  
  48.     return 0;  
  49. }  

三.示例結構

原圖:


切割後的圖:




四.總結

根據切割的塊數,計算小圖片尺寸大小,存放到vector容器裡,要的時候再讀取出來就可以了。沒用到opencv的ROI,但也可以使用。

五.參考

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