Я пытаюсь выполнить сложную деформацию изображения, используя плотный оптический поток (я пытаюсь обернуть второе изображение примерно в ту же форму, что и первое изображение). Я, наверное, все это неправильно, но я опубликую то, что я пытался:
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 шкал серого. Я возвращаю потоковую циновку, которая, кажется, имеет смысл, но теперь я пытаюсь переназначить мое исходное (то есть не в градациях серого) изображение, используя эту информацию о потоках.
Я предполагал, что мне нужна функция переназначения, но я получаю очень искаженное изображение. Ни одна из моей информации о цвете не выживает вообще. Я просто получаю оранжево-черное изображение, которое имеет небольшое сходство с моим исходным изображением.
Я предполагаю, что я неправильно понимаю функцию перенаправления, и она либо не выполняет то, что я хочу, либо я получаю что-то не так с тем, что я передаю.
Если у первого есть какие-либо предложения относительно того, как я могу решить эту проблему? Если последнее, что я делаю не так?
Любая помощь очень ценится!
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);
Других решений пока нет …