2012-06-13 33 views
5

Tôi có một vài hình ảnh trong Mat đối tượng tất cả với cùng một kích thước tôi muốn tạo một Bix cv::Mat đối tượng để giữ tất cả chúngCONCATENATE Mat trong OpenCV

Vì vậy, kích thước của ma trận mới là: widthNew = widthOld x số ma trận, chiều cao không thay đổi.

tôi thấy rằng một bản sao như vậy có thể được thực hiện bằng:

void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL) 

nhưng sau đó, làm thế nào có thể mặt nạ được xác định ba thời điểm khác nhau trong ba ma trận ?.

Kính trọng, Moataz

+0

Hãy cẩn thận rằng kích thước tối đa cho IplImage là khoảng 4000 * 4000. Bạn cũng có thể phải giảm độ phân giải của hình ảnh đầu vào – jlengrand

+0

Mặt nạ là tùy chọn, bạn không cần phải xác định một mặt nạ. –

+0

được. Tôi sẽ ghi nhớ điều đó, thnx –

Trả lời

5

Bạn sử dụng một roi để xác định một hình ảnh mà thực sự là một khu vực của hình ảnh điểm đến và sau đó sao chép vào đó. thấy Copy an cv::Mat inside a ROI of another one

+0

Thnx. Hoạt động tốt –

1

Bạn có thể muốn đi xem the source code of cvShowManyImages(), mà là một chức năng mà phải mất vài hình ảnh như đầu vào và concatenates chúng thành một hình ảnh 3-kênh duy nhất để được hiển thị:

Phương pháp được sử dụng là thiết lập ROIs của một hình ảnh lớn duy nhất và sau đó thay đổi kích thước và sao chép hình ảnh đầu vào vào hình ảnh đơn lớn.

Nếu bạn tạo hình ảnh đích đủ lớn để giữ các hình ảnh khác của mình, bạn sẽ không cần phải định lại kích thước.

Nếu bạn muốn biết cách chuyển đổi giữa IplImage < ->cv::Mat, hãy kiểm tra this thread.

+0

nghe có vẻ thú vị, thnx. Tôi nghĩ rằng tôi sẽ sao chép ý tưởng để thực hiện một cái gì đó tương tự bằng cách sử dụng tinh khiết cv :: Mat thay vì IpImage –

2

Tôi nghĩ có một cách dễ dàng để thực hiện việc này. OpenCV có phương pháp không được ghi nhận là hconcat()vconcat(). Cái đầu tiên là nối ngang và cái thứ hai để nối dọc.

Bạn có thể sử dụng chúng theo cách này:

Mat A, B; 
... //In this part you initialize the Mat A and Mat B. 

Mat H, V; //These are the destination matrices 
hconcat(A, B, H); 
vconcat(A, B, V); 

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

+0

Điểm đến có thể giống như một trong các nguồn để 'vconcat (out, out1, out); vconcat (out, out2, out); 'làm việc tốt cho tôi trong một ngữ cảnh đa luồng (để kết hợp đầu ra từ các luồng riêng lẻ). – Izaan

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