Деформация изображения с использованием 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));

Теперь это предполагает, что вы знаете угловые точки той части изображения, которую хотите деформировать. Если вы не знаете, как получить очки среднего квадрата, я рекомендую вам взглянуть на эти отличные ответы.

Однако, пока у вас есть четыре угловых точки, этот метод будет работать. Вы можете даже попробовать это, вручную ища средние квадратные угловые точки и вставляя их.

Другие вопросы по тегам