想实现的就是把下图中的书摆正~
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
网友评论