2014-04-11 12 views
27

Sto cercando di impostare un nuovo valore di colore a qualche pixel in una cv :: Mat immagine mio codice è qui sotto:C++ e OpenCV ottenere e impostare il colore dei pixel a 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); 

Sembra di ottenere il buon pixel in uscita (con cout) tuttavia nell'immagine di output (con imwrite) i pixel in questione non vengono modificati. Ho già provato a usare color.val [0] .. Non riesco ancora a capire perché i colori dei pixel nell'immagine di output non cambino. grazie

risposta

43

Hai fatto tutto tranne che copiare nuovamente il nuovo valore di pixel sull'immagine.

Questa linea prende una copia del pixel in una variabile locale:

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

Così, dopo aver cambiato color come richiedete, basta riportarlo in questo modo:

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

Così, in pieno, qualcosa di simile a questo:

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

basta usare un punto di riferimento:

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

perché il problema riguardava un colore Mat. nel caso uchar, ofc. usa 'uchar & c = image.at (y, x)' – berak

+0

scusa, intendevo commentare un'altra risposta, e +1. –

8

Non vorrei utilizzare .at per motivi di prestazioni.

Definire una struct:

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

e quindi utilizzarlo come questo sul tuo cv :: immagine Mat:

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

image.ptr (y) si dà un puntatore al scanline y . E scorrere i pixel con loop di xey

+0

Qual è il senso di impostare il valore 'pack' su 2 se' sizeof (uchar) 'è 1? –

+0

Il compilatore aggiungerà i byte di riempimento a una struttura. L'impostazione di pack modifica tali paddings in modo che i dati siano allineati in un altro modo.Modifica: consulta questo post http://stackoverflow.com/questions/3318410/pragma-pack-effect – Flocke

+2

'pragma' non ha alcun effetto su una struttura creata esclusivamente da 'uchar's. Leggi una bella spiegazione [qui] (http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/compiler_ref/pragma_pack.htm) per dettagli. –

Problemi correlati