Деформация изображения с использованием opencv
Я хочу выполнить деформацию изображения, используя opencv. Я обнаружил 4 угла изображения ((ex) 4000x4000) и получил матрицу преобразования, используя getPerspectiveTransform
в opencv. Теперь я хочу деформировать изображение в центре изображения. Так что я использовал warpPerspective
, Размер исходного изображения, которое я ввожу, составляет 450x450, и я использую матрицу преобразования, которую я рассчитал для всего изображения.
Но ничего не отображается на экране. Любая помощь приветствуется.
Вот пример кода и пример изображения.
Это область деформации, которую я хочу получить от изображения.(Src_crop в коде)
Это результат.
source[0] = Point2f(lt.x, lt.y);
source[1] = Point2f(rt.x, rt.y);
source[2] = Point2f(rb.x, rb.y);
source[3] = Point2f(lb.x, lb.y);
dst[0] = Point2f(6, 10);
dst[1] = Point2f(3899, 7);
dst[2] = Point2f(3901, 3899);
dst[3] = Point2f(9, 3902);
Mat transformMatrix ;
transformMatrix = getPerspectiveTransform(source, dst);
Mat dstFrame ;
warpPerspective(src_crop, dstFrame, transformMatrix, Size(450, 450));
1 ответ
Ваше преобразование не выполняется, так как вы используете неправильные значения для вашего getPerspectiveTransform
метод. Вы, кажется, перепутали, как вы создаете выходное изображение и как вы заполняете конечные углы из данных этого изображения.
Кроме того, важно, чтобы вы связали правые углы в массивах (левый верхний, правый верхний, левый нижний, правый нижний), вы, кажется, перепутали это.
Этот пример покажет вам, как соединить правильные точки и вывести их в виде пустого выходного изображения:
// Assuming your source image is called 'sourceImage' and you have the corner points you need:
// Create vectors to store the corners
vector<Point2f> originalCorners;
vector<Point2f> destinationCorners;
// Put the Sudoku corners in your originalCorners
originalCorners.clear();
originalCorners.push_back(Point2f(lt.x, lt.y);
originalCorners.push_back(Point2f(rt.x, rt.y);
originalCorners.push_back(Point2f(lb.x, lb.y);
originalCorners.push_back(Point2f(rb.x, rb.y);
// Output image size of 450x450
int ouputImageWidth = 450;
int outputImageHeight = 450;
// Create an empty image (450x450) to output your transformation result in
Mat transformedOutputImage(ouputImageWidth, outputImageHeight, sourceImage.type());
// Now put the corners of the output image so the warp knows where to warp to
destinationCorners.clear();
destinationCorners.push_back(Point2f(0, 0));
destinationCorners.push_back(Point2f(ouputImageWidth, 0));
destinationCorners.push_back(Point2f(0, outputImageHeight));
destinationCorners.push_back(Point2f(ouputImageWidth, outputImageHeight));
// Now we have all corners sorted, so we can create the warp matrix
Mat warpMatrix = getPerspectiveTransform(originalCorners, destinationCorners);
// And now we can warp the Sudoku in the new image
warpPerspective(sourceImage, transformedOutputImage, warpMatrix, Size(ouputImageWidth, ouputImageHeight));
Теперь это предполагает, что вы знаете угловые точки той части изображения, которую хотите деформировать. Если вы не знаете, как получить очки среднего квадрата, я рекомендую вам взглянуть на эти отличные ответы.
Однако, пока у вас есть четыре угловых точки, этот метод будет работать. Вы можете даже попробовать это, вручную ища средние квадратные угловые точки и вставляя их.