我正在开发一款应用程序,用户可以拍摄名片或照片。然后,用户将标记物体的四个角落(他们拍摄的物体),就像在许多文档/图像/名片扫描应用程序中看到的那样:
从iOS8+开始,有一个名为CIPerspectiveCorrection的核心图像滤镜。您所需要做的就是传递图像和四个点。
此外,还有一个支持iOS6+的滤镜称为CIPerspectiveTransform,可以用类似的方式(扭曲图像)。
cv::Mat deskew(cv::Mat& capturedFrame, cv::Point2f source_points[], cv::Size finalSize)
{
cv::Point2f dest_points[4];
// Output of deskew operation has same color space as source frame, but
// is proportional to the area the document occupied; this is to reduce
// blur effects from a scaling component.
cv::Mat deskewedMat = cv::Mat(finalSize, capturedFrame.type());
cv::Size s = capturedFrame.size();
// Deskew to full output image corners
dest_points[0] = cv::Point2f(0,s.height); // lower left
dest_points[1] = cv::Point2f(0,0); // upper left
dest_points[2] = cv::Point2f(s.width,0); // upper right
dest_points[3] = cv::Point2f(s.width,s.height); // lower right
// Build quandrangle "de-skew" transform matrix values
cv::Mat transform = cv::getPerspectiveTransform( source_points, dest_points );
// Apply the deskew transform
cv::warpPerspective( capturedFrame, deskewedMat, transform, s, cv::INTER_CUBIC );
return deskewedMat;
}
我不知道你的情况确切的解决方案,但是有一种梯形的方法:http://www.comp.nus.edu.sg/~tants/tsm/TSM_recipe.html - 这个想法是不断地构建转换矩阵。理论上,您可以添加将您的形状转换为梯形的转换。
还有很多类似这样的问题:https://math.stackexchange.com/questions/13404/mapping-irregular-quadrilateral-to-a-rectangle ,但我没有检查过解决方案。