2012-01-22 11 views
1

我5rows X 4cols CV ::墊:不能使用CopyTo用於複製的長方形矩陣轉換成3D矩陣

int output_size[] = {5,4}; 
cv::Mat im1(2, output_size, CV_32FC1); 

float* ptr = (float*)im1.data; 

for (unsigned int r = 0; r < output_size[0]; r++) { 
    for (unsigned int c = 0; c < output_size[1]; c++) { 
    *ptr = (r*im1.size.p[1])+c; 
    std::cout << *ptr++ << ","; 
    } 
    std::cout << std::endl; 
} 

使矩陣如下所示:

[ 0, 1, 2, 3, 
    4, 5, 6, 7, 
    8, 9, 10, 11, 
12, 13, 14, 15, 
16, 17, 18, 19] 

此外,我還有一個3depth X 5rows X 4cols CV ::墊:

int output_size2[] = {3,5,4}; 
cv::Mat im2(3, output_size2, CV_32FC1); 
im2 = 0; 

現在我想複製到IM1,比方說,IM2的第二層。我做了以下操作:

cv::Range rngs[] = {cv::Range(1,2), cv::Range::all(), cv::Range::all()}; 
cv::Mat dst = im2(rngs); 
im1.copyTo(dst); 

這似乎不起作用。 im1.copyTo(dst)對im2沒有影響 - 所有第二層值在操作後都保持爲零。經過一番反省之後,似乎opencv發現由於dst的大小是1x5x4而不是5x4,它會重新分配dst。

將矩形矩陣複製到3D矩陣的一層中的正確方法是什麼?


好這個工程:

void* ptr = im2.data + im2.step[0]*1; 
memcpy(ptr, (void*)im1.data, im1.total()*sizeof(float)); 

但有一個 「的OpenCV」 的方式來解決這個問題。

回答

1

如果您有n個2-dim圖像,並且您想將它們用作具有第n個尺寸n的三維矩陣中的圖層,則可以使用cv::merge。見documentation

參見:

cv:splitdocumentation