2013-07-03 32 views
9

Tôi đang cố gắng thực hiện một hình ảnh phức tạp của hình ảnh bằng cách sử dụng Lưu lượng quang dày đặc (Tôi đang cố gắng để wap hình ảnh thứ hai vào cùng hình dạng với hình ảnh đầu tiên). Tôi có thể nhận được tất cả điều này sai nhưng Ill đăng lên những gì tôi đã cố gắng:Hình ảnh cong vênh OpenCV dựa trên 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); 

Ý tưởng nếu tôi tính toán dòng chảy từ 2 khung thang màu xám. Tôi lấy lại một dòng chảy mat mà có vẻ hợp lý nhưng bây giờ tôi đang cố gắng để remap hình ảnh ban đầu của tôi (tức là không màu xám) bằng cách sử dụng thông tin dòng chảy này.

Tôi giả định rằng chức năng remap là những gì tôi muốn nhưng tôi nhận được một hình ảnh rất bị bóp méo từ nó. Không có thông tin màu nào của tôi tồn tại. Tôi chỉ đơn giản là kết thúc với một hình ảnh màu cam và màu đen mang một chút giống với hình ảnh ban đầu của tôi.

Tôi đoán rằng tôi là sự hiểu lầm chức năng remap và nó hoặc là không làm những gì tôi muốn nó làm hoặc tôi nhận được một cái gì đó sai trái với những gì tôi đang đi qua trong.

Nếu trước đây có ai có bất cứ đề nghị như thế nào tôi có thể giải quyết vấn đề này? Nếu sau này, tôi đang làm gì sai?

Bất kỳ trợ giúp nào được đánh giá cao!

+0

Xin chào, tôi thấy bài đăng này và tôi có cùng một vấn đề (chính xác cùng một vấn đề trong dứt khoát) và tôi đã tự hỏi liệu bạn có tìm thấy cách để làm điều đó không? (Tôi biết bài viết này là cũ, và tôi xin lỗi cho điều đó, nhưng tôi không tìm thấy bất kỳ phản ứng trong thời gian thực tế: o) Cảm ơn rất nhiều! –

+0

@RaphaelSchimchowitsch: Có lẽ tốt nhất để bắt đầu câu hỏi của riêng bạn. Tôi không phải là nếu tôi thậm chí còn có mã tôi đã viết để làm điều này ... Tôi đã nhận được một cái gì đó làm việc mặc dù. Bây giờ chắc chắn nếu nó đã được với dòng quang mặc dù ... – Goz

+0

Ahah, ok, tôi đã đăng câu hỏi của riêng tôi nhưng tôi tìm thấy bài đăng này vì vậy tôi đã chỉ tự hỏi nếu bạn có thể giúp tôi :) Nhưng ok ^^ Cảm ơn rất nhiều cho bạn đáp ứng :) –

Trả lời

13

Chức năng remap không thể hoạt động với luồng quang. Chức năng remap biến đổi hình ảnh nguồn bằng cách sử dụng bản đồ quy định:

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

dòng quang có một công thức:

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

Vì vậy, để sử dụng remap chức năng đầu tiên bạn cần phải tạo ra một bản đồ từ dòng chảy:

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

Rực rỡ, điều đó giải thích rất nhiều. Thật không may là dòng chảy không chứa dữ liệu tôi nghĩ nó đã quay trở lại bảng vẽ và có lẽ một câu hỏi khác sớm! Cảm ơn! – Goz

+3

Lưu ý việc sử dụng luồng ngược, tức là từ 'nextFrame' tới' prevFrame'. Điều này là cần thiết vì các vectơ dòng chảy được đưa ra cho các pixel nguồn ("nơi đã làm điều này đi"), trong khi chúng ta quan tâm đến các điểm ảnh đích ("nơi này đã đến từ đâu"). – lapis

Các vấn đề liên quan