美文网首页
iOS_OpenCV透视映射

iOS_OpenCV透视映射

作者: Champion | 来源:发表于2018-06-25 15:34 被阅读32次

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


    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

    相关文章

      网友评论

          本文标题:iOS_OpenCV透视映射

          本文链接:https://www.haomeiwen.com/subject/xqvqyftx.html