2014-04-11 10 views
27

Próbuję ustawić nową wartość koloru do pewnego piksela w cv :: Mat obraz mojego kodu jest poniżej:C++ i OpenCV pobrać i ustawić kolor piksela do 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); 

Wydaje się, aby uzyskać dobry piksel na wyjściu (z cout) jednak w obrazie wyjściowym (z imwrite) dany piksel nie jest modyfikowany. Próbowałem już używać color.val [0] .. Nadal nie mogę zrozumieć dlaczego kolory pikseli na obrazie wyjściowym nie zmieniają się. dziękuje

Odpowiedz

43

Zrobiłeś wszystko, z wyjątkiem skopiowania nowej wartości pikseli z powrotem do obrazu.

Linia ta wykonuje kopię piksela do zmiennej lokalnej:

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

tak, po zmianie color jak jest potrzebna, wystarczy ustawić go tak:

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

Tak więc, w pełny, coś w tym stylu:

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

po prostu użyj odniesienia:

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

, ponieważ problem dotyczył koloru Mat. w sprawie uchar, ofc. użyj 'uchar & c = image.at (y, x)' – berak

+0

Przepraszam, chciałem skomentować inną odpowiedź i +1. –

8

Nie użyłbym .at ze względu na wydajność.

Definiowanie struct:

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

a następnie używać go w ten sposób na swoim cv :: Mat obraz:

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

image.ptr (y) daje wskaźnik do Scanline y . I iteruj po pikselach z pętlami x i y

+0

Jakie jest znaczenie ustawienia wartości 'pack' na 2, jeśli" sizeof (uchar) "wynosi 1? –

+0

Kompilator doda dopełniające Bajty do struktury. Ustawienie paczki zmienia te paddings tak, że dane są wyrównane w inny sposób.Edycja: Zobacz ten post http://stackoverflow.com/questions/3318410/pragma-pack-effect – Flocke

+2

'pragma' nie ma wpływu na strukturę wyłącznie z 'uchar's. Przeczytaj ładne wyjaśnienie [tutaj] (http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/compiler_ref/pragma_pack.htm) dla Detale. –

Powiązane problemy