openCV 为 16CU1 查找 table
openCV look up table for 16CU1
我需要将 Mat 8UC1 [0,255] 的值替换为 cv::Mat lookUpTable(1, 256, CV_16UC1); 的值我检查了这个 OpenCV tutorial 一个解释,这是最快的方法,但是,当我检查每个位置的 LUT 的分配值时,我只减少了 8 位,所以我丢失了其他 8 位。这是源代码:
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(8bits) 但我如何分配完整值?
尝试
unsigned short* p = (unsigned short*) lookUpTable.data;
OpenCV LUT 仅适用于 CV_8U,因此您可以将数字拆分为 3,即 3x CV_8U,或 CV_8UC3。但是你不能在 LUT 中有超过 256 个元素,并且不能有 0..255 以外的其他值作为索引。
换句话说,您可以将 uchar
s 解析为 uchar
s 或将 uchar
s 解析为 float
s:CV_8UC1 -> CV_8UC1 或 CV_8UC1 -> CV_8UC3(我没试过 CV_8UC4,它可以工作)。
要获取 CV_8UC3 的元素,请检查 cv::Vec3b
我发现 this,您可能会感兴趣
我需要将 Mat 8UC1 [0,255] 的值替换为 cv::Mat lookUpTable(1, 256, CV_16UC1); 的值我检查了这个 OpenCV tutorial 一个解释,这是最快的方法,但是,当我检查每个位置的 LUT 的分配值时,我只减少了 8 位,所以我丢失了其他 8 位。这是源代码:
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(8bits) 但我如何分配完整值?
尝试
unsigned short* p = (unsigned short*) lookUpTable.data;
OpenCV LUT 仅适用于 CV_8U,因此您可以将数字拆分为 3,即 3x CV_8U,或 CV_8UC3。但是你不能在 LUT 中有超过 256 个元素,并且不能有 0..255 以外的其他值作为索引。
换句话说,您可以将 uchar
s 解析为 uchar
s 或将 uchar
s 解析为 float
s:CV_8UC1 -> CV_8UC1 或 CV_8UC1 -> CV_8UC3(我没试过 CV_8UC4,它可以工作)。
要获取 CV_8UC3 的元素,请检查 cv::Vec3b
我发现 this,您可能会感兴趣