首页 > 解决方案 > opencv 将倾斜视图转换为平面视图

问题描述

这是我用 USB 相机拍摄的照片。我的相机与水平线有一个角度,目标在底部,平行线和正交线划定矩形。便利贴是中心矩形的控制标记。

原始视图 观点看法

然后我处理了几个分步处理,以调整视图的“倾斜”并提取线条。这是没有变换的线提取:

{"type":"toGray"} => mat.cvtColor(cv4.COLOR_BGR2GRAY);

{"type":"toBlur","size":10} => mat.gaussianBlur(new cv4.Size(size, size),0);

{"type":"toCanny","low":50,"high":150} => mat.canny(low_threshold, high_threshold);

{"type":"getLines","rho":1,"theta":0.01745329222222222,"threshold":15,"min_line_length":50,"max_line_gap":20 }] => 让行 = mat.houghLinesP(rho , theta, 阈值, min_line_length, max_line_gap);

结果是: 结果 1

现在,我想在提取线条之前使用“warpAffine”功能校正视图倾斜。我选择居中矩形的四个点,以构建两个“三点数组”(src,dst): 改造方案

matTransf = cv4.getAffineTransform( srcPoints, dstPoints);
resultMat = mat.warpAffine( matTransf, new cv4.Size( mat.cols, mat.rows));

结果如下: 最后结果

错误在哪里?

我也试过:

// four points at each corner of the rectangle, srcPoints for the  picture, and dstPoints for the theoric shape

// With getPerspectiveTransform
matTransf = cv4.getPerspectiveTransform( srcPoints, dstPoints);
resultMat = mat.warpPerspective( matTransf, new cv4.Size( mat.cols, mat.rows));

// With findHomography
let result = cv4.findHomography( srcPoints, dstPoints);
matTransf = result.homography;
resultMat = mat.warpPerspective( matTransf, new cv4.Size( mat.cols, mat.rows));

结果是: findHomograhy 和 getPerspectiveTransform

此致。

标签: opencvtransform

解决方案


变换不是亲和,而是单应性描述的视角。在图像中选择物理矩形的四个角,将它们映射到与物理矩形具有相同纵横比的矩形中的点,从它们估计单应性(findHomography),最后扭曲(warpPerspective)。


推荐阅读