Я работаю над проектом, который объединяет разорванные кусочки бумаги в одно изображение.
До сих пор я выполнил предварительную обработку, чтобы найти контуры и найти подходящие фрагменты.
Я получаю 2 изображения, которые совпадают, но находятся в отдельных 2 cv::Mat
объекты.
Теперь мне нужно объединить эти 2 изображения в 1 изображение. Один из способов сделать это — скопировать пиксель за пикселем обоих изображений в новое изображение, но это будет очень дорого и дороже процессора.
Мне нужна функция библиотеки OpenCV или обходной путь с аналогичной функцией, чтобы сделать работу.
Ты можешь использовать скопировать в функция openCV. Например, предположим, что piece1 и piece2 — это изображения двух листов бумаги:
Mat twoPieces (piece1.rows, 2*piece1.cols, piece1.type());
piece1.copyTo (twoPieces(Rect(0, 0, piece1.cols, piece1.rows)));
piece2.copyTo (twoPieces(Rect(piece1.cols, 0, piece2.cols, piece2.rows)));
Я предположил, что изображения имеют одинаковый размер, но если их нет, вы можете обновить код. Также пример выше показал, как скопировать все изображение. Вы можете определить маску и скопировать только места с кусочками бумаги. Для рисования маски вы можете использовать полилинии.
Mat mask1(piece1.size(), CV_8U, Scalar(0));
polylines(mask1, piece1Contours, true, 255, CV_FILLED);
piece1.copyTo (twoPieces(Rect(0, 0, piece1.cols, piece1.rows)), mask1);
И, конечно, если вы знаете смещение между листами бумаги, вы можете изменить точку начала в Rect так, чтобы обе части были смежными друг с другом.
Mat mask2(piece2.size(), CV_8U, Scalar(0));
polylines(mask2, piece2Contours, true, 255, CV_FILLED);
piece2.copyTo (twoPieces(Rect(dx, 0, piece2.cols, piece2.rows)), mask2);
Я еще раз упростил пример, предполагая, что смещение происходит только в направлении X. Это может быть сделано со сдвигом в обоих направлениях X и Y, но это потребует дополнительных вычислений, таких как оценка Ограничительная рамка ваших полигонов.
Других решений пока нет …