2014-04-11 11 views
27

Ich versuche, einen neuen Farbwert zu einem gewissen Pixel in einen Lebenslauf zu setzen :: Mat Bild ist mein Code unten:C++ und opencv erhalten und stellen Pixelfarbe Mat

Mat image = img; 
    for(int y=0;y<img.rows;y++) 
    { 
     for(int x=0;x<img.cols;x++) 
     { 
     Vec3b color = image.at<Vec3b>(Point(x,y)); 
     if(color[0] > 150 && color[1] > 150 && color[2] > 150) 
     { 
      color[0] = 0; 
      color[1] = 0; 
      color[2] = 0; 
      cout << "Pixel >200 :" << x << "," << y << endl; 
     } 
     else 
     { 
      color.val[0] = 255; 
      color.val[1] = 255; 
      color.val[2] = 255; 
     } 
    } 
    imwrite("../images/imgopti"+to_string(i)+".tiff",image); 

Es scheint, die zu bekommen good pixel in output (mit cout) aber im output image (mit imwrite) werden die betreffenden pixel nicht verändert. Ich habe bereits versucht, color.val [0] zu verwenden. Ich kann immer noch nicht herausfinden, warum sich die Pixelfarben im Ausgabebild nicht ändern. danke

Antwort

43

Sie haben alles außer Kopieren Sie den neuen Pixelwert zurück auf das Bild.

Diese Linie nimmt eine Kopie des Pixels in eine lokale Variable:

Vec3b color = image.at<Vec3b>(Point(x,y)); 

Also, nach dem Wechsel color, wie Sie benötigen, setzen Sie ihn einfach so zurück:

image.at<Vec3b>(Point(x,y)) = color; 

Also, voll, so etwas wie dieses:

Mat image = img; 
for(int y=0;y<img.rows;y++) 
{ 
    for(int x=0;x<img.cols;x++) 
    { 
     // get pixel 
     Vec3b color = image.at<Vec3b>(Point(x,y)); 

     // ... do something to the color .... 

     // set pixel 
     image.at<Vec3b>(Point(x,y)) = color; 
    } 
} 
12

nur eine Referenz verwenden:

Vec3b & color = image.at<Vec3b>(y,x); 
color[2] = 13; 
+1

, weil das Problem über eine Farbe Mat war. im Fall uchar, ofc. Verwenden Sie 'uchar & c = image.at (y, x)' – berak

+0

Entschuldigung, ich wollte eine andere Antwort kommentieren, und +1. –

8

Ich würde .at aus Leistungsgründen nicht verwenden.

definieren eine Struktur:

//#pragma pack(push, 2) //not useful (see comments below) 
struct RGB { 
    uchar blue; 
    uchar green; 
    uchar red; }; 

Und es dann wie folgt verwenden auf Ihren Lebenslauf :: Mat Bild:

RGB& rgb = image.ptr<RGB>(y)[x]; 

image.ptr (y) gibt Ihnen einen Zeiger auf die Scanlinie y . Und durchlaufen Sie die Pixel mit Schleifen von x und y

+0

Welchen Sinn hat es, den 'pack'-Wert auf 2 zu setzen, wenn' sizeof (uchar) '1 ist? –

+0

Der Compiler fügt der Struktur padding Bytes hinzu. Die Einstellung von pack ändert diese Abstände, so dass die Daten auf andere Weise ausgerichtet sind. Bearbeiten: Siehe diesen Beitrag http://stackoverflow.com/questions/3318410/pragma-pack-effect – Flocke

+2

'pragma' hat keine Auswirkungen auf eine Struktur gemacht ausschließlich von 'uchar's. Lesen Sie eine schöne Erklärung [hier] (http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/compiler_ref/pragma_pack.htm) für Einzelheiten. –