2013-07-03 6 views
9

Dense Optical Flow를 사용하여 이미지의 복잡한 뒤틀림을 수행하려고합니다. 두 번째 이미지를 첫 번째 이미지와 대략 동일한 모양으로 정리하려고합니다. 나는 아마 내가 무엇을 시도했다이 모든 잘못하지만 병이 게시물을 받고 있어요 :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 기능은 옵티컬 플로우에서 작동하지 않습니다.

광학 흐름이 또 다른 공식을 가지고

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

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

그래서 먼저 흐름지도를 작성해야 remap 기능을 사용하는 기능 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