2017-04-03 45 views
2

3通道墊我想使用其他地方分配的數據以創建一個OpenCV的3通道墊,其中每個信道的像素是在一起的,不象一個OpenCV的氈中的數據,其中來自不同信道的數據是交錯的。OpenCV的創建從連續數據陣列

Mat outputMat = Mat(dimY, dimX, CV_8UC3, rawData); 
// This works only if rawData interleaves channel data like an OpenCv Mat 

有一種方法,而不必訴諸於分割信道從臨時墊下面的溶液和右聲道數據拷貝到相應的位置以創建的OpenCV墊?

void createMat(unsigned char *rawData, unsigned int dimX, unsigned int dimY) 
{ 
    Mat outputMat = Mat(dimY, dimX, CV_8UC3); 

    // use outputMat to draw some stuff 

    Mat channelR = Mat(dimY, dimX, CV_8UC1, rawData); 
    Mat channelG = Mat(dimY, dimX, CV_8UC1, rawData + dimX * dimY); 
    Mat channelB = Mat(dimY, dimX, CV_8UC1, rawData + 2 * dimX * dimY); 

    std::vector<Mat> channels(3); 
    split(outputMat, channels); 

    channels[2].copyTo(channelR); 
    channels[1].copyTo(channelG); 
    channels[0].copyTo(channelB); 
} 

我需要經常做這種手術,所以我在想,如果有不涉及調用split()copyTo()功能每次的解決方案。

謝謝!

enter image description here

+0

'merge(channels,outputMat)'? –

+0

我已經嘗試過,但似乎沒有工作。正確的數據不會進入正確的渠道。它仍然是交錯的。 – locke14

+0

你的問題對我來說並不清楚,你想從OpenCV mat獲得'RGB'通道嗎? – ZdaR

回答

3

您可以直接使用merge避免splitcopyTo

Mat createMat(unsigned char *rawData, unsigned int dimX, unsigned int dimY) 
{ 
    // No need to allocate outputMat here 
    Mat outputMat; 

    // Build headers on your raw data 
    Mat channelR(dimY, dimX, CV_8UC1, rawData); 
    Mat channelG(dimY, dimX, CV_8UC1, rawData + dimX * dimY); 
    Mat channelB(dimY, dimX, CV_8UC1, rawData + 2 * dimX * dimY); 

    // Invert channels, 
    // don't copy data, just the matrix headers 
    std::vector<Mat> channels{ channelB, channelG, channelR }; 

    // Create the output matrix 
    merge(channels, outputMat); 

    return outputMat; 
} 

我測試了一些其他的方法,但是它們會導致要慢一些。只是爲了記錄,我認爲這會更快,但轉置真的很重:

Mat outputMat(3, dimY*dimX, CV_8UC1, rawData); 
Mat tmp = outputMat.t(); 
outputMat = tmp.reshape(3, dimY); 
cvtColor(outputMat, outputMat, COLOR_RGB2BGR); 
+0

'merge(channels,outputMat);'似乎沒有使用與'rawData'相同的數據。例如,設置'outputMat.at (0,0)= Vec3b(128,128,128);'不反映在位置'RAWDATA [0]','RAWDATA [dimX * dimY]'的值和'rawData [2 * dimX * dimY]'。我檢查,它看起來像'outputMat.ptr <無符號字符>(0)!= rawData' – locke14

+1

1)outputMat'不被反射回來在'rawData'的更改'。數據在使用merge時被深度複製。由於您使用的是與OpenCV不同的佈局,因此如果要使用數據,則需要深度複製數據。 2)顯然通過'outputMat'指出的數據是從'rawData' ......你需要_interleave_自己的原始數據在'Mat'使用它們不同。 – Miki

+0

這就是我所害怕的。對於我的應用程序,我使用OpenCV繪製一些內容並顯示在另一個分配'rawData'的應用程序中。所以,似乎每當我更改'outputMat'的內容時,我都需要對更改進行深層複製以反映在'rawData'中。如果我有較高的刷新率,那麼手動__交錯數據會有很多開銷。如果我理解正確的話,貌似是沒有解決方案,我可以做到這一點只有一次,在我的OpenCV的後續變化'outputMat'將在'rawData'自動反映。謝謝回覆。沒錯。@Miki – locke14