2016-01-29 8 views
0

Мне нужно заменить значение Mat 8UC1 [0,255] на значения cv :: Mat lookUpTable (1, 256, CV_16UC1); Я проверяю это OpenCV tutorial объяснение, которое является самым быстрым методом, однако, когда Im проверяет назначенные значения LUT в каждой позиции, im только sabing 8 бит, так что Im потерял остальные 8 бит. Это исходный код:openCV look up table for 16CU1

unsigned short int zDTableHexa[256]={0}; 
    .... get the values... 
    cv::Mat lookUpTable(1, 256, CV_16UC1); 
    uchar* p = lookUpTable.data; 
    for(int i = 0; i < 256; i++){ 
     p[i] = zDTableHexa[i]; 
     cout<<(int)p[i]<<":"<<zDTableHexa[i]<<sizeof(p[i])<<":"<<sizeof(zDTableHexa[i])<<endl; 
    } 

Результат печатание:

104: 872
101: 869
97: 865
93: 861
90: 858
86 : 854
83: 851
80: 848
76: 844
73: 841
70: 838
66: 834
63: 831

При проверке в двоичной системе только первые 8 бит. Я понимаю, что указатель UCHAR (8 бит), но как я могу назначить полное значение?

ответ

1

попробовать

unsigned short* p = (unsigned short*) lookUpTable.data; 
+0

Спасибо это сработало! – aburbanol

0

OpenCV LUT работает только с CV_8U, так что вы можете сделать, это разделив число на 3, то есть 3x CV_8U или CV_8UC3. Но вы не можете иметь более 256 элементов в LUT, а не другие значения, чем 0..255 в качестве индекса.

Другими словами, вы можете разобрать uchar с до uchar с или uchar с до float с: CV_8UC1 -> CV_8UC1 или CV_8UC1 -> CV_8UC3 (я не пробовал йота CV_8UC4, он может работать).

Для получения элементов проверки CV_8UC3 cv::Vec3b


я нашел this, которые могут заинтересовать вас