學習opencv之(六)-影象切割,使用ROI
阿新 • • 發佈:2019-02-03
一.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();
二.影象分割
- // Cut_image.cpp : 定義控制檯應用程式的入口點。
- //
- /***********************************************************************
- * OpenCV 2.4.4 測試例程
- * 杜健健 提供
- ***********************************************************************/
- #include "stdafx.h"
- #include <opencv2/opencv.hpp>
- #include <opencv2/imgproc/imgproc.hpp>
- #include <opencv2/highgui/highgui.hpp>
- #include <iostream>
- #include <vector>
- usingnamespace
- usingnamespace cv;
- //剪下圖片為m * n 塊
- void Cut_img(Mat src_img,int m,int n,Vector<Mat> ceil_img){
- int t = m * n;
- int height = src_img.rows;
- int width = src_img.cols;
- int ceil_height = height/m;
- int ceil_width = width/n;
- Mat roi_img,tmp_img;
- Point p1,p2;
- for(int i = 0;i<m;i++)
- for(int j = 0;j<n;j++){
- //p1 =
- Rect rect(i+j*ceil_width,j+i*ceil_height,ceil_width,ceil_height);
- src_img(rect).copyTo(roi_img);
- ceil_img.push_back(roi_img);
- imshow("roi_img",roi_img);
- //getchar();
- waitKey(0);
- //rectangle(i+j*ceil_width,j+i*ceil_height,);
- }
- }
- void show_images(Vector<Mat> imgs,int n){
- //do something
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- Mat img = imread("D://input//lena.jpg",1);
- imshow("src img",img);
- int m = 3;
- int n = 3;
- Vector<Mat> ceil_img = m*n;
- Cut_img(img,m,n,ceil_img);
- waitKey();
- return 0;
- }
三.示例結構
原圖:
切割後的圖:
四.總結
根據切割的塊數,計算小圖片尺寸大小,存放到vector容器裡,要的時候再讀取出來就可以了。沒用到opencv的ROI,但也可以使用。
五.參考
http://www.opencvchina.com/thread-228-1-1.html