2013-03-20 7 views
0

У меня есть IplImage I., и он должен иметь значения от 0 до 255 (в пикселях). у меня в нем, к сожалению, странные специальные символы, как:Weird Ценности в IplImage

ØÕÖÕÓÎËÍÌÈÃÃÁ»¶±«¨¤Ÿ™”‰ 

я сделал следующее: Uchar * D_i = (Uchar *) I-> ImageData;

Как преобразовать эти символы в значения от 0 до 255?

+1

Как вы получаете значения из изображения и как вы их печати? – sgarizvi

+0

unsigned char обозначает 8-битные значения, если вы хотите посмотреть значения с помощью отладчика, которые вы могли бы просто: int tmp = d_I [pos]; – jamk

ответ

-1

Вместо литья в Uchar, вы должны бросить в целое:

int* d_l = (int*)l->imageData 
+0

Это допустимо, только если глубина IplImage равна 'CV_32S'. Я не думаю, что изображение в проблеме OP имеет глубину 'CV_32S'. Его глубина - 'CV_8U', поэтому упоминается, что значения находятся в диапазоне от 0 до 255. – sgarizvi

+0

@Turgal MY глубина 8U. Так это применимо? – user2187476

+0

Необработанное исключение в 0x00aa73c7 в ex4.exe: 0xC0000005: Место чтения нарушения доступа 0x0d83dc30. – user2187476

0

Так как вы пометили C++, вот как вы можете напечатать символ в виде числа с помощью COUT. Сохраните свой предыдущий код.

uchar* d_I = (uchar*) I->imageData; 
std::cout <<(int) *d_I; 
+0

для C++ Я бы сказал, что правильный стиль: std :: cout << static_cast (* d_I); – jamk

0

Вы принимаете изображение-> widthStep? пиксели - это не просто указатель, переданный в тип данных, который вы передали cvCreateImage (или то, что было загружено cvLoadImage), а затем увеличилось ... строки выровнены с 4 или 8 байтами, поэтому каждая строка не обязательно касается в памяти (хотя он будет близок к нескольким байтам).

Доступ ваших пикселей с:
(неподписанный символ) CV_IMAGE_ELEM (myImage, неподписанным символом, у, х)

или если вы начали с 64F глубины изображения:
(двойной) CV_IMAGE_ELEM (myImage , двойной, строка, столбец)

см: How to access the elements of single channel IplImage in Opencv