2011-11-16 14 views
5

Mam dwa obrazy w opencv: Obraz A i Zdjęcie B.Jak połączyć dwa obrazy bez utraty intensywności w opencv

Zdjęcie A jest ramką wyjściową z kamery .
Obraz B jest przezroczystym obrazem alfa uzyskanym przez maskowania jedno zdjęcie.
Przed maskowania image B jest to wypaczone z cvWarpPerspective()

  • próbowałem cvAddWeighted()- on traci intensywność, gdy dajesz alfa i wartość beta
  • próbowałem aishack- Nawet tu Państwo traci ogólną intensywność obrazu wyjściowego
  • Próbowałem silveiraneto.net- Nie pomocne w moim przypadku

Proszę mi pomóc z czymś, co nie powoduje utraty intensywności obrazu wyjściowego po wymieszaniu.

góry dzięki

Odpowiedz

2

W końcu dostałem odpowiedź. Składa się z 5 kroków ....

krok - 1

cvGetPerspectiveTransform(q,pnt,warp_matrix); 
//where pnt is four point x and y cordinates and warp_matrix is a 3 x 3 matrix 

krok - 2

cvWarpPerspective(dst2, neg_img, warp_matrix,CV_INTER_LINEAR) 
//dst2 is overlay image ,neg_img is a blank image 

krok - 3

cvSmooth(neg_img,neg_img,CV_MEDIAN); //smoothing the image 

krok - 4

cvThreshold(neg_img, cpy_img, 0, 255, CV_THRESH_BINARY_INV); 
//cpy_img is a created image from image_n 

Krok - 5

cvAnd(cpy_img,image_n,cpy_img);// image_n is a input image 
cvOr(neg_img,cpy_img,image_n); 

Wyjście - image_n (bez utraty intensywności obrazu wejściowego)

+0

A otrzymasz nakładka bez antyalii. Możesz to zrobić w dwóch krokach: 1) get warp_matix, 2) warpPerspective (pic, frame, warp_matrix, frame.size(), INTERLINEINTER, BORDER_TRANSPARENT); –

2

Kiedy mówisz, że można stracić intensywność ... zostawić na pytanie, w jaki sposób go stracić?

Czy masz luźne intensywność w sensie:

że podczas dodawania obrazów trafisz maksymalną intensywność, a reszta jest odrzucana. (Przykład dla 8-bitowego dodatku pikseli: Pix1 = 200 i, Pix2 = 150 i. "Pix1 + Pix2 = 350", ale maksymalna wartość to 255, więc Pix1 + Pix2 = 255)

To poprzednie wartości obrazu A jest zagrożone przez dodanie go do obrazu B, który obejmuje tylko niektóre części obrazu. (Przykład dla obrazu 8-bitowego: Pix1 = 200 i, Pix2 = 150, (Pix1 + Pix2)/2 = 175, ale gdy wartość piksela drugiego obrazu wynosi zero, Pix2 = 0. Następnie (Pix1 + Pix2)/2 = 100, co stanowi połowę wartości oryginalnego obrazu)

Jedna z tych obserwacji powinna zawierać informacje o tym, co należy zrobić. Nie bardzo wiem, zgodnie z funkcjami, o których wspomniałeś, z jakim podejściem korzystają.

+0

Dzięki za odpowiedzi +1 za to, ale co muszę tutaj jest .... Załóżmy, że masz obraz okularów (png przezroczysty) w Photoshopie, w jaki sposób nakładasz ten obraz na twarz kogoś (inny obraz), przeciągając go i dostosowujesz do przodu i do tyłu ... To samo Chcę zrobić w opencv ... Wszystko, co mówisz, to moje pytanie ... Potrzebuję jakiś sposób, aby tego uniknąć .... – Wazzzy

+0

Jeśli mógłbyś pracować z czterokanałowym obrazem podobnym do RGB (A) dla czerwonego zielonego niebieski i aplha, zamiast tylko 3 kanałów jak RGB. Możesz je dodać, zmieniając każdy piksel w obrazie A (obraz z tyłu) w kierunku nowego obrazu (za pomocą folii) i robiąc to w skali od 0 do 1, w oparciu o kanał alfa. Obawiam się, że nadal nie mogę podać dokładnych przykładów kodu. – Sonaten

+0

Dodatkowo. Jeśli twoja przezroczystość jest sztywno wartościami _On i Off_, możesz po prostu chcieć sprawdzić wartość alfa dla każdego piksela w przezroczystym obrazie, a następnie zapisać tę wartość na obrazie tła, jeśli wartość alfa jest "prawdziwa". – Sonaten