2011-07-04 58 views
14

Tôi rất mới với OpenCV (bắt đầu sử dụng nó hai ngày trước), tôi đang cố gắng cắt một hình ảnh tay từ một hình ảnh sâu lấy từ Kinect , Tôi cần hình ảnh tay để nhận dạng cử chỉ. Tôi có hình ảnh dưới dạng loại cv::Mat. Câu hỏi của tôi là:OpenCV C++, nhận được vùng quan tâm (ROI) bằng cách sử dụng cv :: Mat

  1. Có cách nào để chuyển đổi cv::Mat-cvMat vì vậy mà tôi có thể sử dụng phương pháp cvGetSubRect để có được những khu vực quan tâm?
  2. Có phương pháp nào trong cv::Mat mà tôi có thể sử dụng để lấy một phần của hình ảnh không?

Tôi muốn sử dụng IplImage nhưng tôi đã đọc ở đâu đó bây giờ là cv::Mat.

Trả lời

29

Bạn có thể sử dụng quá tải toán tử chức năng gọi trên cv::Mat:

cv::Mat img = ...; 
cv::Mat subImg = img(cv::Range(0, 100), cv::Range(0, 100)); 

Kiểm tra OpenCV documentation để biết thêm thông tin và cho các chức năng quá tải mà phải mất một cv::Rect. Lưu ý rằng việc sử dụng hình thức cắt này tạo ra một tiêu đề ma trận mới, nhưng không sao chép dữ liệu.

+1

Cảm ơn bạn đã trả lời! Tôi đã thử Range nhưng nó đã cho tôi một lỗi thời gian chạy nhưng cv :: Rect() làm việc tốt! – vprasad

+0

Bạn có thể chỉnh sửa câu hỏi của mình bằng mã 'cv :: Range' không thành công không? Ngoài ra, hãy chấp nhận câu trả lời của tôi nếu nó hữu ích. –

+2

cv: Phạm vi đã cho tôi lỗi thời gian chạy, nhưng cv :: Rect hoạt động như một sự quyến rũ! cảm ơn! – Froyo

7

Có lẽ một cách tiếp cận khác có thể là:

//Create the rectangle 
cv::Rect roi(10, 20, 100, 50); 
//Create the cv::Mat with the ROI you need, where "image" is the cv::Mat you want to extract the ROI from 
cv::Mat image_roi = image(roi) 

Tôi hy vọng điều này có thể giúp đỡ.

Các vấn đề liên quan