2012-04-03 10 views
2

würde Ich mag einen Teil des Bildes mit meinem Bild in OpenCVOverlay kleineres Bild in einem größeren Bild in OpenCV

I

verwendet
cvGetPerspectiveMatrix() with a warpmatrix and using cvAnd() and cvOr() 

ersetzen kann aber nicht die Arbeit zu

Dies ist der Code, der derzeit das Bild und ein weißes Polygon für das Ersatzbild anzeigt. Ich möchte das weiße Polygon für ein Bild durch eine beliebige Dimension ersetzen, die skaliert und durch die Region ersetzt werden soll.

Während der Code in javacv ist, könnte ich es Java umwandeln, auch wenn C-Code

grabber.start(); 
while(isDisp() && (image=grabber.grab())!=null){ 
    if (dst_corners != null) {// corners of the image to be replaced 
    CvPoint points = new CvPoint((byte) 0,dst_corners,0,dst_corners.length); 
    cvFillConvexPoly(image,points, 4, CvScalar.WHITE, 1, 0);//white polygon covering the replacement image 
    } 
correspondFrame.showImage(image); 
} 

Alle Zeiger auf diese wird sehr hilfreich gebucht wird.

Update:

I verwendet warpmatrix mit diesem Code und ich bekomme einen schwarzen Fleck für das Overlay-Bild

cvSetImageROI(image, cvRect(x1,y1, overlay.width(), overlay.height())); 
CvPoint2D32f p = new CvPoint2D32f(4); 
CvPoint2D32f q = new CvPoint2D32f(4); 

q.position(0).x(0); 
q.position(0).y(0); 
q.position(1).x((float) overlay.width()); 
q.position(1).y(0); 
q.position(2).x((float) overlay.width()); 
q.position(2).y((float) overlay.height()); 
q.position(3).x(0); 
q.position(3).y((float) overlay.height()); 

p.position(0).x((int)Math.round(dst_corners[0]); 
p.position(0).y((int)Math.round(dst_corners[1])); 
p.position(1).x((int)Math.round(dst_corners[2])); 
p.position(1).y((int)Math.round(dst_corners[3])); 
p.position(3).x((int)Math.round(dst_corners[4])); 
p.position(3).y((int)Math.round(dst_corners[5])); 
p.position(2).x((int)Math.round(dst_corners[6])); 
p.position(2).y((int)Math.round(dst_corners[7])); 

cvGetPerspectiveTransform(q, p, warp_matrix); 

cvWarpPerspective(overlay, image, warp_matrix); 

ich einen schwarzen Fleck für das Overlay-Bild zu bekommen und auch wenn das Originalbild eines Polygon mit 4 Scheitelpunkten wird das Overlay-Bild als Rechteck gesetzt. Ich glaube, das liegt am ROI. Könnte mir bitte jemand sagen, wie man das Bild so anpasst wie es ist und auch warum ich einen schwarzen Fleck anstelle des Overlay-Bildes bekomme.

+0

Ist Ihr Polygon-Achse ausgerichtet ist (genauer gesagt, Rechteck)? – cxyzs7

+0

Es ist kein Rechteck und es ist nicht Achse ausgerichtet, aber es hat nur 4 Ecken. –

Antwort

0

Ich denke cvWarpPerspective (link) ist das, was Sie suchen.

Also anstatt das zu tun

CvPoint points = new CvPoint((byte) 0,dst_corners,0,dst_corners.length); 
cvFillConvexPoly(image,points, 4, CvScalar.WHITE, 1, 0);//white polygon covering the replacement image 

Versuchen
cvWarpPerspective(yourimage, image, M, image.size(), INTER_CUBIC, BORDER_TRANSPARENT); 

Wo M die Matrix Sie von cvGetPerspectiveMatrix

erhalten wird
+0

Hallo ich benutze cvGetPerspectiveTransform (q, p, warp_matrix); wo p die Bildecken hat und q die Überlagerungsbildecken hat. Ich verwende dann diese warp_matrix für Warpperspektive, aber es ersetzt immer noch nicht das Bild. Fehle ich etwas? –

+0

Können Sie Ihren Code einfügen? Und was meinst du mit "nicht ersetzen"? – cxyzs7

+0

Ich habe ein Update hinzugefügt, bitte überprüfen Sie den Code dort :) Wie gesagt, ich möchte ein Overlay-Bild in einem Polygon mit 4 Ecken, nicht unbedingt ein Rechteck passen. Vielen Dank für Ihre Hilfe –

0

Eine Möglichkeit ist es, das Bild auf die weiße Polygongröße zu skalieren und es dann in das aufgenommene Bild zu kopieren, das seine Region von Interesse einstellt (hier ist eine link, die den ROI erklärt). Der Code sollte wie folgt aussehen:

resize(pic, resizedImage, resizedImage.size(), 0, 0, interpolation); //resizedImage should have the points size 
cvSetImageROI(image, cvRect(the points coordinates)); 
cvCopy(resizedImage,image); 
cvResetImageROI(image); 

Ich hoffe, das hilft.

Mit freundlichen Grüßen, Daniel