我正在研究一个应用程序,需要对通过手机摄像头拍摄的照片应用透视畸变校正。 拍摄照片后,想法是将其显示在图像视图上,并让用户标记文档的四个角(卡,一张纸等),然后根据这些点应用更正。 这是什么即时试图达到一个例子:imageview的透视校正
http://1.bp.blogspot.com/-ro9hniPj52E/TkoM0kTlEnI/AAAAAAAAAbQ/c2R5VrgmC_w/s640/s4.jpg
如何做到这一点的的Android任何想法?
我正在研究一个应用程序,需要对通过手机摄像头拍摄的照片应用透视畸变校正。 拍摄照片后,想法是将其显示在图像视图上,并让用户标记文档的四个角(卡,一张纸等),然后根据这些点应用更正。 这是什么即时试图达到一个例子:imageview的透视校正
http://1.bp.blogspot.com/-ro9hniPj52E/TkoM0kTlEnI/AAAAAAAAAbQ/c2R5VrgmC_w/s640/s4.jpg
如何做到这一点的的Android任何想法?
你想要做的是在各种艺术名称下进行,“角钉”是视觉效果行业常用的一种。需要在两个步骤中进行:
原始图像的4个(非共线,透视失真)角和目标(未失真)图像的4个角定义了映射。这种映射称为“homography” - 阅读指向维基百科页面的细节。一旦映射已知,就可以通过插值计算步骤(2)的变形:对于目标图像中的每个像素,找到原始图像中的对应像素。由于这通常不是整数坐标,所以可以从邻居中插入其颜色。使用各种插值方案,常见的是最近邻,双线性和双三次(结果中顺序增加顺序)。
对于Android,我建议安装OpenCV SDK,然后使用geometry transformation routines(getPerspectiveTransform和warpPerspective进行上述两个步骤)。
您不必使用库为此。 您还可以使用Canvas
类的drawBitmap
函数之一,并使用Matrix
类的setPolyToPoly
函数初始化该矩阵。
public static Bitmap cornerPin(Bitmap b, float[] srcPoints, float[] dstPoints) {
int w = b.getWidth(), h = b.getHeight();
Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
Canvas c = new Canvas(result);
Matrix m = new Matrix();
m.setPolyToPoly(srcPoints, 0, dstPoints, 0, 4);
c.drawBitmap(b, m, p);
return result;
}
(的油漆对象只需要使抗混叠。)
用法:
int w = bitmap.getWidth(), h = bitmap.getHeight();
float[] src = {0, 0, 0, h, w, h, w, 0};
float[] dst = {0, 0, 0, h, w, 0.8f * h, w, 0.2f * h};
Bitmap transformed = cornerPin(bitmap, src, dst);
凡src
是源点的坐标,dst
是坐标的目的地点。结果:
非常感谢您的解释!我会尝试OpenCV。 –