2012-10-17 13 views
10

thể trùng lặp:
Understanding region of interest in openCV 2.4OpenCV tiểu hình ảnh từ một hình ảnh Mat

tôi muốn có được một tiểu hình ảnh (một trong những giới hạn bởi các hộp màu đỏ bên dưới) từ một hình ảnh (Định dạng Mat). Làm thế nào để tôi làm điều này?

enter image description here

đây là tiến bộ của tôi cho đến nay:

include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

using namespace std; 
using namespace cv; 
int main() 
{ 
    Mat imgray, thresh; 
    vector<vector<Point> >contours; 
    vector<Point> cnt; 
    vector<Vec4i> hierarchy; 
    Point leftmost; 

    Mat im = imread("igoy1.jpg"); 
    cvtColor(im, imgray, COLOR_BGR2GRAY); 
    threshold(imgray, thresh, 127, 255, 0); 
    findContours(thresh, contours, hierarchy, RETR_TREE,CHAIN_APPROX_SIMPLE); 
} 
+1

Câu hỏi này như đã được hỏi và trả lời, ít nhất là [ở đây] (http://stackoverflow.com/questions/12705817/understanding-region-of-interest- in-opencv-2-4/12706208 # 12706208) và [ở đó] (http://stackoverflow.com/questions/12369697/access-sub-matrix-of-a-multidimensional-mat-in-opencv/12370641#12370641) – remi

Trả lời

24

Bạn có thể bắt đầu chọn một đường viền (trong trường hợp của bạn, các đường viền tương ứng với tay). Sau đó, bạn tính toán hình chữ nhật bao quanh cho đường bao này. Cuối cùng bạn tạo một tiêu đề ma trận mới từ nó.

int n=0;// Here you will need to define n differently (for instance pick the largest contour instead of the first one) 
cv::Rect rect(contours[n]); 
cv::Mat miniMat; 
miniMat = imgray(rect); 

Cảnh báo: Trong trường hợp này, miniMat là một tiểu vùng của imgray. Điều này có nghĩa rằng nếu bạn sửa đổi trước đây, bạn cũng sửa đổi sau này. Sử dụng miniMat.copyTo(anotherMat) để tránh điều này.

Tôi hy vọng nó giúp, Chúc may mắn

+1

cảm ơn bạn! tôi có một đầu ra có đầu ra chính xác nhưng cũng bao gồm các đường bao khác. tôi đã sử dụng RETR_EXTERNAL thay vì RETR_TREE để có ít đường nét hơn. làm thế nào để tôi xác định đường viền nào là chính xác? –

+1

@OgNamdik Bạn có thể lặp qua các đường bao và tính diện tích hoặc diện tích của hình chữ nhật giới hạn (hoặc các thông số khác) cho mỗi đường. Trong trường hợp của bạn, có vẻ như bạn chỉ đơn giản là có thể giữ cho các đường viền có diện tích lớn nhất ... Ngoài ra, đừng ngần ngại chấp nhận câu trả lời nếu bạn hài lòng với nó. : D –

+0

ok cảm ơn bạn rất nhiều! –