2017-01-23 3 views
1

Я пытаюсь установить значения RGB для некоторых пикселей в двоичном изображении. Но всякий раз, когда координата больше (89, 89), она дает мне ошибку утверждения! Мое разрешение изображения в порядке, потому что я обращаюсь к значениям RGB из (150, 150) координат. Если координата (89, 89) или меньше, она работает нормально. Мой код:Установка значений RGB пикселей в определенном изображении в openCV

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 Ошибка: не удалось Assertion (тускнеет < = 2 & & данные & & (без знака) i0 < (без знака) size.p [0] & & (без знака) (i1 * DataType < _Tp > :: каналы) < (без знака) (size.p 1 * каналы()) & & ((((SizeOf (size_t) < < 28) | 0x8442211) >> ((DataType < _Tp> :: глубина) & ((1 < < 3) - 1)) * 4) & 15) == elemSize1()) в cv :: 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

Хорошо у меня есть ответ теперь благодаря МЕНЗУРКУ намекают в комментариях :) Я предлагаю решение другим людям!

Мне просто нужно определить выход как целое число. Таким образом, последний cout будет

std::cout<<"Pixel at position (x, y) : ("<<150<<", "<<150<<") ="<<(int)img_bw.at<uchar>(150, 150)<<std::endl; 
Смежные вопросы