2013-07-23 13 views
5

Próbuję połączyć dwa obrazy. Jest to łatwe, jeśli mają ten sam rozmiar, ale jeśli jedno z obrazów jest mniejsze lub większe, cv :: addWeighted kończy się niepowodzeniem.Kopiowanie/mieszanie obrazów o różnych rozmiarach za pomocą opencv

Obrazek A (oczekuje się powiększenie) Obraz B (oczekuje się, że będzie mniejszy)

Próbowałem stworzyć ROI - próbował stworzyć trzeci obraz wielkości i kopiowania B wewnątrz - Mogę wydaje się, że to prawda. Proszę pomóż.

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()); 

Nawet coś cvSetImageROI - mogą działać, ale nie mogę znaleźć odpowiednik C++ - może pomóc - ale nie wiem, jak go używać, aby nadal zachować zawartość obrazu, tylko umieścić kolejne zdjęcie wewnątrz ROI ...

+0

Czy chcesz, aby 'out_image' było (1) przyciętą częścią' A' zmieszaną z 'B' (a więc wielkością' B') lub (2) rozmiar 'A' z wybraną częścią zmieszaną z' B' (stąd rozmiar 'A')? – Jacob

+0

Wielkość A - z zaznaczoną sekcją połączoną z B – Thalia

+0

Dlaczego "szerokość = (* wartości wejściowe) .at (0) .cols - 1"? Dlaczego nie '(* input_images) .at (0) .cols'? – Jacob

Odpowiedz

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); 

Pamiętaj, że jeśli chcesz wtopić B bezpośrednio do A, wystarczy roi.

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

Ciągle otrzymuję ten sam błąd, co zawsze otrzymałem: Rozmiary argumentów wejściowych nie pasują do siebie (operacja nie jest ani "macierzą tablową" (gdzie tablice mają ten sam rozmiar i taką samą liczbę kanałów), ani "macierzą operacyjną scalar op array 'w nieznanej funkcji, ... \ arithm.cpp, wiersz 1277 – Thalia

+0

Wypróbuj 'cv :: Rect roi = cv :: Rect (min_x, min_y, B.cols, B.rows);' – Jacob

+0

To rodzaj pracował - dziękuję - z wyjątkiem wyniku jest obraz A zmieniono na rozmiar obrazu B - i dwóch połączonych ze sobą.) Użyłem A (roi) jako wyjścia – Thalia

-1

można łatwo połączyć dwa obrazy używając addWeighted() funkcję

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

stwierdzenie dwa obrazy

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

stwierdzenie wartość alpha i beta a następnie wywołać funkcję. Jesteś skończony. Szczegóły można znaleźć pod linkiem: Blending of Images using Opencv

Powiązane problemy