2017-01-23 119 views
1

我试图设置二进制图像中某些像素的RGB值。但是每当坐标超过(89,89),它就会给我一个断言错误!我的图像分辨率很好,因为我正在从(150,150)坐标访问RGB值。如果坐标是(89,89)或更少,它可以正常工作。我的代码:在openCV中设置某个图像中的像素的RGB值

cv::Mat img_gray, img_bw; 
//read an image 
cv::Mat3b img_bgr = cv::imread("test.jpg"); 
cv::imshow("Original Image", img_bgr); 

//conversion to binary from color 
cv::cvtColor(img_bgr, img_gray,CV_RGB2GRAY); 
cv::threshold(img_gray, img_bw, 75.0, 255.0, THRESH_BINARY); 

//accessing BGR of position (150, 150) from a color image 
std::cout<<"Pixel at position (x, y) : ("<<150<<", "<<150<<") ="<<img_bgr(150,150)<<std::endl; 

//Setting BGR of position (150, 150) in binary image 
img_bw.at<Vec3b>(150, 150)[0] = 255; 
img_bw.at<Vec3b>(150, 150)[1] = 255; 
img_bw.at<Vec3b>(150, 150)[2] = 255; 
std::cout<<"Pixel at position (x, y) : ("<<150<<", "<<150<<") ="<<img_bw.at<Vec3b>(150, 150)<<std::endl; 

这里,如果我把89而不是150在“设置BGR”部分,那么它的作品。否则全部错误是:

OpenCV的错误:断言失败(变暗< = 2 & &数据& &(无符号)10 <(无符号)size.p [0] & &(无符号)(I1 *字段类型字段< _TP > ::通道)<(无符号)(size.p 1 *通道())& &((((的sizeof(为size_t)< < 28)| 0x8442211)>>((数据类型< _TP> ::深度)&( (1 < < 3)-1))* 4)& 15)== elemSize1())in cv :: Mat :: at,file e:\ opencv \ opencv \ build \ include \ opencv2 \ core \ mat.hpp,line 538

那么这是什么类型的内存空间错误? 在此先感谢帮助! :)

更新:我试过这种方式!但是现在输出结果是空白的。

cv::Mat img_gray, img_bw; 
//read an image 
cv::Mat3b img_bgr = cv::imread("test.jpg"); 
cv::imshow("Original Image", img_bgr); 

//conversion to binary from color 
cv::cvtColor(img_bgr, img_gray,CV_RGB2GRAY); 
cv::threshold(img_gray, img_bw, 75.0, 255.0, THRESH_BINARY); 

//accessing BGR of position (150, 150) from a color image 
std::cout<<"Pixel at position (x, y) : ("<<150<<", "<<150<<") ="<<img_bgr(150,150)<<std::endl; 

//Setting BGR of position (150, 150) in binary image 
img_bw.at<uchar>(150, 150) = 255; 
std::cout<<"Pixel at position (x, y) : ("<<150<<", "<<150<<") ="<<img_bw.at<uchar>(150, 150)<<std::endl; 

我的测试图像在这里

This is my test image here

和输出是在这里

Output image here

+3

您的img_bw是灰色的。所以你不能通过输入img_bw.at 来访问任何像素。你应该改用img_bw.at (150,150)= 255 – alex

+0

@alex我已经试过了。在那种情况下,我的std :: cout <(150,150)简直是空白! –

+1

@TousifZaman我们无法修复您不会显示给我们的代码。你知道使用'Vec3b'是不正确的。如果您使用'uchar'向我们显示您的代码以及错误和您的输入图像,或许我们可以帮助您。 – beaker

回答

0

好吧,我有现在的答案感谢烧杯在评论提示:)我正在为其他人提供帮助!

我只需要将输出定义为一个整数。所以最后的cout会像

std::cout<<"Pixel at position (x, y) : ("<<150<<", "<<150<<") ="<<(int)img_bw.at<uchar>(150, 150)<<std::endl; 
相关问题