How to do a perspectiveTransform when I don't know the matrix

asked 2017-09-10 03:51:39 -0500

yode gravatar image

updated 2017-09-12 21:27:42 -0500

If I have a such empty paper, then I write some text on it,then I deform it in Photoshop. So I get such wraped image. Now hope this result image align that empty paper. I mean this is my expected result. Actually I can do it almost by other language. I just not very familiar the OpenCV. This is my try in Wolfram Mathematica :

Before Align

After Align

As you see,the result is very good, But I have to implement it by C++ and OpenCV now. I note we have a function getPerspectiveTransform can get a transform matrix. But I have to get four point from the source image and target image. I really don't want to do such thing. I mean those four point is hard to get in some case.

Question

When I don't want to find those four points. How to do a perspective transform to align this two image?

Current try with C++/OpenCV

#include "opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

    int main()
    {
        Mat mark = imread("wrap.jpg", IMREAD_GRAYSCALE);
    rectangle(mark, Rect(0, 0, mark.cols, mark.rows), Scalar(0));
    Mat rect = mark.clone();
    Mat tempmark = rect.clone();
    floodFill(mark, Point(0, 0), Scalar(255), 0, 10, 40, 8);

    Mat empty = imread("empty.png", IMREAD_GRAYSCALE);
    rectangle(empty, Rect(0, 0, empty.cols, empty.rows), Scalar(0));
        rect = empty.clone();
        Mat tempempty = rect.clone();
    floodFill(empty, Point(0, 0), Scalar(255), 0, 10, 40, 8);
    rect.release();

double start_time = (double)getTickCount();

resize(mark, mark, empty.size());

Mat m = Mat::eye(3, 3, CV_32F);
findTransformECC(empty, mark, m, 3);
Mat result;
warpPerspective(mark, result, m, mark.size());

cvtColor(255-empty, empty, COLOR_GRAY2BGR);
cvtColor(mark, mark, COLOR_GRAY2BGR);
cvtColor(result, result, COLOR_GRAY2BGR);

double total_time = ((double)getTickCount() - start_time) / getTickFrequency();
cout << "Total time is: " << total_time << "s" << endl;

Mat element = getStructuringElement(MORPH_RECT, Size(2, 2));
dilate(empty - Scalar(0, 0, 255), empty, element);
namedWindow("before", WINDOW_NORMAL);
imshow("before", mark-empty);
namedWindow("after", WINDOW_NORMAL);
imshow("after", result-empty);

waitKey(0);

return 0;

}

edit retag flag offensive close merge delete

Comments

@sturkmen I'm sure your this project can help me. but I have to say that very hard to read.Could you tuning it for my this question?

yode gravatar imageyode ( 2017-09-10 03:56:40 -0500 )edit