1

私は現在、モーション補正を含むプロジェクトに取り組んでいます。

この時点で、cv::Mat 入力に入力画像があります。

cv::resize( input, input_resized, cvSize(64,48), 12, 12, CV_INTER_AREA);
input_resized.convertTo(input_float, CV_32F); //this might be redundant while cv::rezise dst should be 32F.

これで、モーション ベクトルは 2 チャネルの cv::Mat モーションに保存され、次のように保存されます。

// w -image.width , h-image.height
    X0  Y0  X1   Y1   X2   Y2   ...  Xw-1  Yw-1      
    Xw  Yw  Xw+1 Yw+1 Xw+2 Yw+2 ...  X2w-1 Y2w-1
    ...
    X(h-1)w Y(h-1)w   ............. X(h-1)(w-1)Y(h-1)(w-1)

だから私が使用する場合:

std::vector<cv::Mat> motionvect(2);
cv::split(motion, motionvect);

motionvect(0) で X を取得し、motionvect2(1) で Y を取得します。

さらに私は試しました:

std::vector<cv::Mat> rgbChannels(3);
cv::split(input_float, rgbChannels);
cv::remap(rgbChannels[0], outChannels[0], motionvect[0], motionvect[1], CV_INTER_LINEAR, IPL_BORDER_CONSTANT, cvScalar(0,0, 0));
cv::remap(rgbChannels[1], outChannels[1], motionvect[0], motionvect[1], CV_INTER_LINEAR, IPL_BORDER_CONSTANT, cvScalar(0,0, 0));
cv::remap(rgbChannels[2], outChannels[2], motionvect[0], motionvect[1], CV_INTER_LINEAR, IPL_BORDER_CONSTANT, cvScalar(0,0, 0));

cv::merge(outChannels, input_with_motion);

この後に得られる結果は非常に奇妙で、Y ベクトルが原因であると誰かが私に言いました。明らかに、X が次のような場合:

1  2  3  4  5
6  7  8  9  10
11 12 13 14 15

Y は次のようになります。

1  6  11  
2  7  12  
3  8  13
4  9  14
5  10 15

あれは正しいですか?転置行列の並べ替え。それが本当なら、motiovect[2] をこのように変更する関数はありますか、それとも個々のコンポーネントごとに変更する必要がありますか?

また、最後のステップでは、プロセスの別の時点でリマップを適用する必要があります。このようなもの:

Function1 ( (float*) input_float.data , (float*) motion.data, (unsigned char*) out.data );
   Function2 ( float* input, float* R, float* G, float* B);
   Function3 ( float* R, float* G, float* B, float* W, float* Z);

ここで、R、G、B、W、Z は float* 型であり、次のように割り当てられます

 R = (float*) malloc (frame_size * sizeof(float) );

float* A と float* B にモーション補正を適用する必要がありますが、これらの入力を再マップすることはできません。それらは InputArray でなければならず、 float* を受け入れられた InputArray 型に変換する方法が見つかりません。

私の考えがあまり整理されていないことは承知していますが、私の質問の少なくとも 1 つを理解していただければ幸いです。1. x0 y0 x1 y1 .. のような cv::Mat にモーション ベクトルが格納されている場合、リマップを適用するにはどうすればよいですか? 2. float* を cv::remap の受け入れ可能な入力に変換できますか?

4

2 に答える 2

2

このチュートリアルhttp://docs.opencv.org/doc/tutorials/imgproc/imgtrans/remap/remap.htmlは、map1、map2 パラメータの設定方法を理解するのに非常に役立ちます。最終的には次のようなものです。

for(int i=0; i< rows; i++){
        for(int j=0; j<col; j++)
            { 
             map_x.at<float>(i,j) = j + motion_vect.ptr<float>(i)[2*j+0];
             map_y.at<float>(i,j) = i + motion_vect.ptr<float>(i)[2*j+1];;
        }}

出力画像を元の画像にするには:

map_x.at<float>(i,j) = j ;
map_y.at<float>(i,j) = i ;
于 2013-12-06T10:25:38.143 に答える
0

#2 の場合、これを実行して、ポインターからいくつかの Mat に float 値を取得できます。

cv::Mat testMat = cv::Mat::zeros(2, 3, CV_32F);
std::cout << "(1, 2) elem = " << testMat.at<float>(1, 2) << std::endl;

float* pTestVal = new float;
*pTestVal = 3.14F;
testMat.at<float>(1, 2) = *pTestVal;
delete pTestVal;

std::cout << "(1, 2) elem = " << testMat.at<float>(1, 2) << std::endl;
于 2013-12-05T02:17:11.997 に答える