iOS_OpenCV透视映射

2018-06-25  本文已影响32人  Champion

想实现的就是把下图中的书摆正~


IMG_0107.JPG
效果图.jpeg

UIImage *image = [UIImage imageNamed:@"996.jpg"];

cv:: Mat srcImage,dstImage;

UIImageToMat(image, srcImage);

cv:: Point2f src_point[] = {cv::Point2f(121,75),
                            cv::Point2f(470,28),
                            cv::Point2f(475,476),
                            cv::Point2f(115,431)
                            };

cv:: Point2f dst_point[] = {cv::Point2f(0,0),
                            cv::Point2f(350,0),
                            cv::Point2f(350,470),
                            cv::Point2f(0,470)
                            };

cv::Mat mat = cv::getPerspectiveTransform(src_point, dst_point);
cv::warpPerspective(srcImage, dstImage, mat, cv::Size(350,470),cv::INTER_LINEAR);

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(50.f, 80.f, 350.f, 470.f)];
imageView.image = MatToUIImage(dstImage);
[self.view addSubview:imageView];

这里用到是getPerspectiveTransform 和 warpPerspective 函数
当然上面用到的src_point 和 dst_point 都是我事先拿到的测试数据,至于如何通过代码获取,还没有很好的想法。

CV_EXPORTS Mat getPerspectiveTransform( const Point2f src[], const Point2f dst[] );

注释 returns 3x3 perspective transformation for the corresponding 4 point pairs. 返回一个3x3的变换矩阵。

CV_EXPORTS_W void warpPerspective( InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR,int borderMode = BORDER_CONSTANT,const Scalar& borderValue = Scalar());

*第一个参数,InputArray 类型的src,输入图像
*第二个参数,OutputArray 类型的dst,函数调用后的运算结果存在这里
*第三个参数,InputArray类型的M,3x3的变换矩阵
*第四个参数,Size类型的dsize,表示输出图像的尺寸
*第五个参数,int类型的flags,插值方法的标识符。默认INTER_LINEAR(线性插值)

标识符 含义
INTER_NEAREST 最紧邻插值
INTER_LINEAR 线性插值(默认)
INTER_AREA 区域插值
INTER_CUBIC 三次样条插值
INTER_LANCZOS4 lanczos 插值
CV_WARP_FILL_OUTLIERS 填充所有输出图像的像素。如果部分像素落在输入图像的边界外,那么其值设定为fillval
CV_WARP_INVERSE_MAP 表示M为输出图像到输入图像的反变换。因此可以直接用来做像素插值。否则,函数从M矩阵得到反变换

*第六个参数,int类型的borderMode,边界像素模式,默认值为BORDER_CONSTANT
*第七个参数,const Scalar&类型的borderValue,在恒定的边界情况下取的值,默认Scalar(),即0

上一篇 下一篇

猜你喜欢

热点阅读