2014-04-11 22 views
27

Tôi đang cố gắng để thiết lập một giá trị màu mới cho một số điểm ảnh thành một cv :: Mat hình ảnh mã của tôi là dưới đây:C++ và opencv get và set màu pixel để 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); 

Có vẻ như để có được tốt điểm ảnh trong đầu ra (với cout) tuy nhiên trong hình ảnh đầu ra (với imwrite) các điểm ảnh có liên quan không được sửa đổi. Tôi đã thử bằng cách sử dụng color.val [0] .. Tôi vẫn không thể tìm ra lý do tại sao các màu pixel trong hình ảnh đầu ra không thay đổi. cảm ơn

Trả lời

43

Bạn đã làm mọi thứ ngoại trừ sao chép giá trị pixel mới trở lại hình ảnh.

dòng này có một bản sao của điểm ảnh vào một biến địa phương:

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

Vì vậy, sau khi thay đổi color như bạn yêu cầu, chỉ cần đặt nó trở lại như thế này:

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

Vì vậy, trong đầy đủ, như sau:

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

chỉ cần sử dụng tham chiếu:

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

bởi vì vấn đề là về màu Mat. trong trường hợp uchar, ofc. sử dụng 'uchar & c = image.at (y, x)' – berak

+0

xin lỗi, tôi muốn bình luận một câu trả lời khác và +1. –

8

Tôi sẽ không sử dụng .at vì lý do hiệu suất.

Định nghĩa một struct:

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

Và sau đó sử dụng nó như thế này trên cv của bạn :: Mat ảnh:

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

image.ptr (y) mang đến cho bạn một con trỏ đến scanline y . Và lặp qua các pixel với các vòng x và y

+0

Ý nghĩa của việc đặt giá trị 'gói' thành 2 nếu' sizeof (uchar) 'là 1? –

+0

Trình biên dịch sẽ thêm Bytes đệm vào một cấu trúc. Các thiết lập của gói thay đổi những paddings để các dữ liệu được liên kết theo một cách khác.Chỉnh sửa: Xem bài đăng này http://stackoverflow.com/questions/3318410/pragma-pack-effect – Flocke

+2

'pragma' không có hiệu lực trên một struct thực hiện chỉ từ 'uchar's. Đọc một lời giải thích hay [tại đây] (http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/compiler_ref/pragma_pack.htm) cho chi tiết. –

Các vấn đề liên quan