天天看點

opencv仿射變換和透視變換(二)實踐篇

一、仿射變換

舉例:基于離散點求最小外接輪廓

其主要思路是先把圖像二值化,得到一系列離散的前景像素點集合,然後利用輪廓的最小外接矩形函數,得到偏斜的矩形大小與角度,通過仿射變換完成校正。代碼實作如下:

int main()
{
    Mat src, gray,dst;
    src = imread("D:\\cv_study\\Exercise\\文字傾斜\\text.png");
    cvtColor(src, gray, CV_BGR2GRAY);
    threshold(gray, dst, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);
    vector<Point>points;
    findNonZero(dst, points);
    RotatedRect box = minAreaRect(points);
    double angle = box.angle;
    if (angle < -45.)
  angle += 90.;
    printf("angle : %.2f\n", angle);
    Point2f vertices[4];
    box.points(vertices);
    for (int i = 0; i < 4; ++i)
  line(src, vertices[i], vertices[(i + 1) % 4], Scalar(0, 0, 255), 2);
    Mat rot_mat = getRotationMatrix2D(box.center, angle, 1);
    Mat rotated;
    warpAffine(src, rotated, rot_mat, src.size(), cv::INTER_CUBIC, 0, Scalar(255, 255, 255));
    waitKey();
    return 0;
}      
opencv仿射變換和透視變換(二)實踐篇

二、透視變換

透視變換的一般過程:讀入圖檔,擷取邊界點,定義目标邊界點,擷取轉換矩陣,執行轉換。

int main()
{
    Mat src = imread("D:\\cv_study\\Exercise\\Perspective Transformation\\1.jpg");
    vector<Point2f>src_coners(4);
    src_coners[0] = Point2f(13, 134);
    src_coners[1] = Point2f(271, 24);
    src_coners[2] = Point2f(180, 411);
    src_coners[3] = Point2f(398, 362);
    circle(src, src_coners[0], 3, Scalar(0, 0, 255), 3, 8);
    circle(src, src_coners[1], 3, Scalar(0, 0, 255), 3, 8);
    circle(src, src_coners[2], 3, Scalar(0, 0, 255), 3, 8);
    circle(src, src_coners[3], 3, Scalar(0, 0, 255), 3, 8);
    vector<Point2f>dst_coners(4);
    dst_coners[0] = Point2f(0, 300);
    dst_coners[1] = Point2f(0, 0);
    dst_coners[2] = Point2f(400, 300);
    dst_coners[3] = Point2f(400, 0);
    Mat warpMatrix = getPerspectiveTransform(src_coners, dst_coners);
    Mat dst;
    warpPerspective(src, dst, warpMatrix, dst.size(), INTER_LINEAR, BORDER_CONSTANT);
    waitKey();
    return 0;
}      
opencv仿射變換和透視變換(二)實踐篇

---

參考文獻:

https://blog.csdn.net/zhangjunp3/article/details/80318533 https://blog.csdn.net/zhangjunp3/article/details/80036310

繼續閱讀