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 以外的其他值作为索引。

换句话说,您可以将 uchars 解析为 uchars 或将 uchars 解析为 floats:CV_8UC1 -> CV_8UC1 或 CV_8UC1 -> CV_8UC3(我没试过 CV_8UC4,它可以工作)。

要获取 CV_8UC3 的元素,请检查 cv::Vec3b


我发现 this,您可能会感兴趣