2012-01-22 1 views
1

に長方形の行列をコピーするのcopyToを使用することはできません::マット:は、私が5rowsのX 4cols CVを持つ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に影響を与えません。操作後に2番目のレイヤーの値はすべてゼロのままです。いくつかのイントロスペクションの後、opencvは、dstのサイズが5x4ではなく1x5x4であるため、dstを再割り当てするように見えます。

長方形のマトリックスを3Dマトリックスの1つのレイヤーにコピーするには、どうすればよいでしょうか?


[OK]を、この作品:

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

を、それを解決するために、 "OpenCVの" 方法があります。

答えて

1

2次元画像がn個あり、3次元のサイズがnの3Dマトリックスのレイヤーとして使用する場合は、cv::mergeを使用できます。 documentationを参照してください。

も参照してください:

cv:splitdocumentation

関連する問題