16位垫的LookUp表是否有效?

时间:2014-11-24 06:10:49

标签: c++ opencv mat

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

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

如何通过指针访问Mat的每个元素?

2 个答案:

答案 0 :(得分:1)

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

OpenCV可以使用多种方法有效地执行查找表转换:它可以使用英特尔IPP库(类IppLUTParallelBody_LUTCN,用于3或4通道图像)。如果有英特尔IPP,您只需复制此类的代码并使用ippiLUTPalette_16u_C3R代替ippiLUTPalette_8u_C3R +修复初始化。)

另一种可能的方法是OpenCL库(用于GPU),它是从ocl_LUT调用的(对不起,没有经验,所以我不能给出任何建议)。

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

答案 1 :(得分:0)

感谢您帮我解决这个问题! 这是我的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;
}