【问题标题】:LookUp Table for 16-Bit Mat Efficient way?16位垫子的查找表高效方式?
【发布时间】:2014-11-24 06:10:49
【问题描述】:

我想使用 opencv 减少 16 位 Mat。我尝试使用 opencv LUT 函数来减少这个垫子。但它似乎不支持 16-Bit Mat。使用 opencv c++ 减少 16 位 Mat 的有效方法是什么?任何帮助表示赞赏!

例如,我想scan & reduce 10 个灰度级的所有像素!我想实现 16 位 Mat 的 opencv 文档中给出的相同示例。

如何通过Pointers访问Mat的各个元素?

【问题讨论】:

  • 你能在这里详细介绍一下“减少”的意思吗?
  • @blackball 我已经更新了我的问题
  • 您可以使用 int 类型的 Mat 构建自己的查找表。
  • 是的,我们可以!但是如何使用指针访问它?你能详细说明你的答案吗?

标签: c++ opencv mat


【解决方案1】:

LUT的源代码在这个文件中:https://github.com/Itseez/opencv/blob/fd59551ff0648d33568d7fc63164bf86c5d3ccb6/modules/core/src/convert.cpp

OpenCV 可以使用多种方法来高效地执行查找表转换:它可以使用英特尔 IPP 库(IppLUTParallelBody_LUTCN 类,用于 3 或 4 通道图像)。如果有Intel IPP,可以直接复制这个类的代码,用ippiLUTPalette_16u_C3R代替ippiLUTPalette_8u_C3R+fix初始化)。

另一种可能的方式是 OpenCL 库(用于 GPU),它是从 ocl_LUT 调用的(抱歉,没有经验,所以我无法提供任何建议)。

或者它使用LUTParallelBody/IppLUTParallelBody_LUTCN 类(对应于单通道和多通道图像)。这些类使用LUT8u_ 模板函数。这里没有火箭科学:它只是迭代图像并替换值。所以你可以简单地复制和粘贴IppLUTParallelBody 并在循环中使用稍微不同的函数。 ParallelLoopBody 基类使用 OpenMP 或 Intel TBB 等库在多个线程中运行循环。我想,您不必修改其中的任何内容即可使其与新功能一起使用。

【讨论】:

    【解决方案2】:

    感谢您帮助我解决了这个问题! 这是我的基于 16 位查找表的缩减代码。希望这可能对某人有用!

    main()
    {
        Size Img_Size(320,240);
        Mat Img_Source_16(Size(320,240),CV_16UC1,Scalar::all(0));
        Mat Img_Destination_16(Size(320,240),CV_16UC1,Scalar::all(0));
    
        unsigned short LookupTable[4096];
        for (int i = 0; i < 4096; i++)
        {
            LookupTable[i]= 4096-i;
        }
    
        int i=0;
        for (int Row = 0; Row < Img_Size.height; Row++)
        {
            for (int Col = 0; Col < Img_Size.width; Col++)
            {
                Img_Source_16.at<short>(Row,Col)= i;
                i++;
                if(i>=4095)
                    i=0;
            }
        }
    
        imshow("Img_Source",Img_Source_16);
    
        t1.start();
        Img_Destination_16= ScanImageAndReduceC_16UC1(Img_Source_16.clone(),LookupTable);
    
        imshow("Img_Destination",Img_Destination_16);
        t1.stop();
    }
    
    Mat& ScanImageAndReduceC_16UC1(Mat& I, const unsigned short* const table)
    {
        // accept only char type matrices
        CV_Assert(I.depth() != sizeof(uchar));
    
        int channels = I.channels();
    
        int nRows = I.rows;
        int nCols = I.cols * channels;
    
        if (I.isContinuous())
        {
            nCols *= nRows;
            nRows = 1;
        }
    
        int i,j;
        unsigned short* p = (unsigned short*)I.data;
        for( unsigned int i =0; i < nCols*nRows; ++i)
            *p++ = table[*p];
    
        return I;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 2020-01-16
      • 2015-10-20
      • 2016-05-23
      • 2013-10-17
      相关资源
      最近更新 更多