2012-07-26 38 views
22

Tôi đang làm việc với OpenCV và C++. Tôi có ma trận X như thế nàyCập nhật submatrix của Mat trong OpenCV

Mat X = Mat::zeros(13,6,CV_32FC1); 

và tôi muốn cập nhật chỉ là một submatrix 4x3, nhưng tôi nghi ngờ cách truy cập ma trận đó một cách hiệu quả.

Mat mat43= Mat::eye(4,3,CV_32FC1); //this is a submatrix at position (4,4) 

Tôi có cần thay đổi yếu tố theo yếu tố không?

Trả lời

27

Một trong những cách nhanh nhất là thiết lập một ma trận đầu chỉ vào khoảng cột/hàng bạn muốn cập nhật, như thế này:

Mat aux = X.colRange(4,7).rowRange(4,8); // you are pointing to submatrix 4x3 at X(4,4) 

Bây giờ, bạn có thể sao chép ma trận của bạn để AUX (nhưng thực chất bạn sẽ sao chép nó sang X, vì aux chỉ là một con trỏ):

mat43.copyTo(aux); 

Thats it.

+1

Tốt! Tôi thích điều này đơn giản hơn tôi nghĩ, cảm ơn! –

+1

Tôi nghĩ rằng OpenCV nên thêm một tham số để kiểm soát việc tái phân bổ Mat :: copyTo có được cho phép hay không. Nếu tôi vô tình làm cho kích thước của aux khác với aux, ý nghĩa của mã sẽ được thay đổi hoàn toàn. – delphifirst

12

Trước tiên, bạn phải tạo một ma trận trỏ đến bản gốc một:

Mat orig(13,6,CV_32FC1, Scalar::all(0)); 

Mat roi(orig(cv::Rect(1,1,4,3))); // now, it points to the original matrix; 

Mat otherMatrix = Mat::eye(4,3,CV_32FC1); 

roi.setTo(5);    // OK 
roi = 4.7f;     // OK 
otherMatrix.copyTo(roi);  // OK 

Hãy ghi nhớ rằng bất kỳ hoạt động có liên quan đến đóng góp trực tiếp, với "=" dấu lạ từ ma trận khác sẽ thay đổi nguồn ma trận roi từ orig đến ma trận kia.

// Wrong. Roi will point to otherMatrix, and orig remains unchanged 
roi = otherMatrix;    
Các vấn đề liên quan