2017-01-23 170 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; 
相關問題