2013-07-23 55 views
5

Tôi đang cố gắng kết hợp hai hình ảnh. Nó rất dễ dàng nếu họ có cùng kích thước, nhưng nếu một trong những hình ảnh nhỏ hơn hoặc lớn hơn cv :: addWeighted không thành công.Sao chép/pha trộn hình ảnh có kích thước khác nhau bằng cách sử dụng opencv

Image (dự kiến ​​sẽ lớn hơn) Hình ảnh B (dự kiến ​​sẽ được nhỏ hơn)

tôi đã cố gắng để tạo ra một ROI - đã cố gắng để tạo ra một hình ảnh thứ ba của kích thước của A và copy B bên trong - Tôi có thể dường như không đúng. Hãy giúp tôi.

double alpha = 0.7; // something 
int min_x = (A.cols - B.cols)/2); 
int min_y = (A.rows - B.rows)/2); 
int width, height; 
if(min_x < 0) { 
    min_x = 0; width = (*input_images).at(0).cols - 1; 
} 
else   width = (*input_images).at(1).cols - 1; 
if(min_y < 0) { 
    min_y = 0; height = (*input_images).at(0).rows - 1; 
} 
else   height = (*input_images).at(1).rows - 1; 
cv::Rect roi = cv::Rect(min_x, min_y, width, height);    
cv::Mat larger_image(A); 
// not sure how to copy B into roi, or even if it is necessary... and keep the images the same size 
cv::addWeighted(larger_image, alpha, A, 1-alpha, 0.0, out_image, A.depth()); 

Thậm chí một cái gì đó giống như cvSetImageROI - có thể làm việc nhưng tôi không thể tìm thấy C++ tương đương - có thể giúp - nhưng tôi không biết làm thế nào để sử dụng nó để vẫn giữ nội dung hình ảnh, chỉ đặt một hình ảnh bên trong ROI ...

+0

Bạn có muốn 'out_image' là (1) phần cắt của' A' được trộn với 'B' (do đó kích thước của' B') hoặc (2) kích thước của 'A' với một phần đã chọn được pha trộn với' B' (do đó kích thước của 'A')? – Jacob

+0

Kích thước của A - với phần được chọn được pha trộn với B – Thalia

+0

Tại sao 'width = (* input_images) .at (0) .cols - 1'? Tại sao không '(* input_images) .at (0) .cols'? – Jacob

Trả lời

9
// min_x, min_y should be valid in A and [width height] = size(B) 
cv::Rect roi = cv::Rect(min_x, min_y, B.cols, B.rows); 

// "out_image" is the output ; i.e. A with a part of it blended with B 
cv::Mat out_image = A.clone(); 

// Set the ROIs for the selected sections of A and out_image (the same at the moment) 
cv::Mat A_roi= A(roi); 
cv::Mat out_image_roi = out_image(roi); 

// Blend the ROI of A with B into the ROI of out_image 
cv::addWeighted(A_roi,alpha,B,1-alpha,0.0,out_image_roi); 

Lưu ý rằng nếu bạn muốn để pha trộn B trực tiếp vào A, bạn chỉ cần roi.

cv::addWeighted(A(roi),alpha,B,1-alpha,0.0,A(roi)); 
+1

Tôi vẫn nhận được lỗi tương tự như tôi luôn nhận được: Kích thước của đối số đầu vào không khớp (Hoạt động không phải là mảng mảng '' (nơi mảng có cùng kích thước và cùng số kênh), cũng không phải 'mảng op mảng vô hướng 'trong chức năng không xác định, ... \ arithm.cpp, dòng 1277 – Thalia

+0

Thử 'cv :: Rect roi = cv :: Rect (min_x, min_y, B.cols, B.rows);' – Jacob

+0

Nó thuộc loại làm việc - cảm ơn bạn - ngoại trừ kết quả là hình ảnh A thay đổi kích cỡ thành kích thước của hình ảnh B - và cả hai được trộn với nhau. Tôi đã sử dụng A (roi) làm đầu ra – Thalia

-1

Bạn có thể dễ dàng ghép hai hình ảnh sử dụng chức năng addWeighted()

addWeighted(src1, alpha, src2, beta, 0.0, dst); 

Khai báo hai hình ảnh

src1 = imread("c://test//blend1.jpg"); 
src2 = imread("c://test//blend2.jpg"); 

Khai báo giá trị của alphabeta và sau đó gọi hàm. Bạn xong việc rồi. Bạn có thể tìm chi tiết trong liên kết: Blending of Images using Opencv

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