2013-07-03 17 views
9

Dense Optical Flowを使用してイメージの複雑なワープを実行しようとしています(2番目のイメージを最初のイメージとほぼ同じ形にワップしようとしています)。OpenCV warping image on calcOpticalFlowFarneback

cv::Mat flow; 
cv::calcOpticalFlowFarneback(mGrayFrame1, mGrayFrame2, flow, 0.5, 3, 15, 3, 5, 1.2, 0); 

cv::Mat newFrame = cv::Mat::zeros(frame.rows, frame.cols, frame.type()); 
cv:remap(frame, newFrame, flow, cv::Mat(), CV_INTER_LINEAR); 

アイデア私は2つのグレースケールフレームから流れマットを計算していますその場合:私はおそらく、私が試したものを、このすべて間違っているが、病気のポストを取得しています。私は理にかなっているように見えるフローマットを取り戻すが、今はこのフロー情報を使って元の(すなわちグレースケールでない)イメージを再マップしようとしている。

リマップ機能は私が望むものだと思っていましたが、非常にひどく歪んだ画像が得られました。色情報はまったく生き残れません。私は元のイメージと少し似ているオレンジ色の黒いイメージで終わるだけです。

私はリマップ機能を誤解だし、それは私がそれをやりたいしないかまたは私は私が渡している何と間違って何かを得ていることを推測している。

をした場合私はこの問題をどのように解決できるかについて誰かに何か提案がありましたか?後者の場合、何が間違っていますか?

大変助かりました!

+0

こんにちは、私はこの記事を見ましたが、私はほぼ同じ問題を抱えています(まったく同じ問題が確定しています)。 (私はこの投稿が古いことを知っています。それについては申し訳ありませんが、現時点では何の応答も見つけられません:o) ありがとう! –

+0

@RaphaelSchimchowitsch:あなた自身の質問を始めるのが最善でしょう。私はこれを行うために書いたコードをまだ持っていても、私は何かを得ることができませんでした。今度はオプティカルフローであったかどうか確かめてください... – Goz

+0

ああ、私はすでに自分の質問を投稿しましたが、私はこの投稿を見つけたので、あなたが私を助けることができるかどうか疑問に思っていました:) しかし、応答:) –

答えて

13

remap機能はオプティカルフローでは機能しません。機能remapは、指定されたマップを用いて入力画像を変換:

dst(x, y) = src(mapx(x, y), mapy(x, y)) 

オプティカルフローは、別の式を有する:

frame1(x, y) = frame2(x + flowx(x, y), y + flowy(x, y)) 

だから、最初remap機能を使用するためにあなたが流れからマップを作成する必要があります。

Mat flow; // backward flow 
calcOpticalFlowFarneback(nextFrame, prevFrame, flow); 

Mat map(flow.size(), CV_32FC2); 
for (int y = 0; y < map.rows; ++y) 
{ 
    for (int x = 0; x < map.cols; ++x) 
    { 
     Point2f f = flow.at<Point2f>(y, x); 
     map.at<Point2f>(y, x) = Point2f(x + f.x, y + f.y); 
    } 
} 

Mat newFrame; 
remap(prevFrame, newFrame, map); 
+1

華麗な、それは多く説明します。残念ながら、フローには、それが描画ボードに戻ったと思ったデータは含まれておらず、まもなく別の質問が出ます!ありがとう! – Goz

+3

逆方向フローの使用、つまり 'nextFrame'から' prevFrame'への注意に注意してください。これは、ソースピクセル(「どこに行ったか」)に対してフローベクトルが与えられ、宛先ピクセル(「どこから来たのか」)に関心があるために必要です。 – lapis