2017-01-23 1 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; 

여기서 "Setting BGR"섹션에 150 대신 89를 입력하면 작동합니다. 그렇지 않으면, 전체 오류 :

OpenCV의 오류 : 어설 (실패 어두워 < = 2 & & 데이터 & & (부호) I0 < (부호) size.p [0] & & (부호) (I1 * 데이터 형식 < _Tp > :: 채널) < (부호) (size.p 1 * 채널()) & & ((((는 sizeof (size_t로) < < 28) | 0x8442211) >> ((데이터 형식 < _Tp> :: 깊이) & ((1 < < 3) - 1)) * 4) & 15) == elemSize1()) :: Mat :: at, 파일 e : \ opencv \ opencv \ build \ include \ opencv2 \ core \ mat.hpp 줄 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

괜찮습니다 :) 나는 다른 사람들을 돕기위한 해결책을 제시하고있다!

출력을 정수로 정의하면됩니다. 따라서 마지막 시합은 다음과 같을 것입니다

std::cout<<"Pixel at position (x, y) : ("<<150<<", "<<150<<") ="<<(int)img_bw.at<uchar>(150, 150)<<std::endl; 
관련 문제