我想使用opencv減少16位Mat。我試圖使用opencv LUT函數來減少這個問題。但它似乎不會支持16位墊。使用opencv C++減少16位Mat的有效方法是什麼?任何幫助表示讚賞!16位Mat查找表高效的方法?
例如我想scan & reduce所有的像素由10灰度級!我想實現在16位Mat的opencv文檔中給出的相同示例。
如何通過指針訪問Mat的每個元素?
我想使用opencv減少16位Mat。我試圖使用opencv LUT函數來減少這個問題。但它似乎不會支持16位墊。使用opencv C++減少16位Mat的有效方法是什麼?任何幫助表示讚賞!16位Mat查找表高效的方法?
例如我想scan & reduce所有的像素由10灰度級!我想實現在16位Mat的opencv文檔中給出的相同示例。
如何通過指針訪問Mat的每個元素?
謝謝你幫我解決這個問題! 這是我的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;
}
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的庫在多個線程中運行循環。我想,你不需要修改任何東西來使它與新功能一起工作。
你可以在這裏提供關於「減少」的更多細節嗎? – blackball 2014-11-24 12:04:19
@blackball我已更新我的問題 – 2014-11-24 13:07:20
您可以使用類型爲int的Mat構建您自己的查找表。 – blackball 2014-11-24 13:17:15