公众号推送看到的

由于深度学习平时训练的是pytorch框架的东西  传统opencv处理图像用的非常少

温故而知新

示例入下图

把这本书矫正

做法是

先缩小图二分之一,高斯模糊+边缘检测+膨胀 去噪(图像噪点基本没有 所有参数看不出好坏),找轮廓,找出面积最大的那个矩形轮廓,确定四个点的映射顺序,透视变换

结果

完整代码

//
// Created by smallflyfly on 2022/10/12.
//#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;const static double AREA_FILTER = 1000.0;void showIm(const Mat& im) {imshow("im", im);waitKey(0);destroyAllWindows();
}void drawPoints(const Mat& im, vector<Point> points) {int index = 1;for (Point& point : points) {circle(im, point, 5, Scalar(0, 255, 255), FILLED);putText(im, to_string(index++), point, FONT_HERSHEY_COMPLEX, 4, Scalar(255, 0, 255), 4);}showIm(im);
}void preProcess(Mat& im) {cvtColor(im, im, CV_BGR2GRAY);GaussianBlur(im, im, Size(3, 3), 3, 0);Canny(im, im, 25, 75);Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));dilate(im, im, kernel);
//    showIm(im);
}vector<Point> getContours(const Mat &im) {vector<vector<Point>> contours;findContours(im, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);vector<Vec4i> hierarchy;findContours(im, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_NONE);
//    vector<vector<Point>> conPoly(contours.size());vector<Rect> boundRect(contours.size());vector<Point> biggest;double maxArea = 0.0;for (auto &contour : contours) {vector<Point> conPoly;double area = contourArea(contour);if (area > AREA_FILTER) {double peri = arcLength(contour, true);approxPolyDP(contour, conPoly, 0.02*peri, true);if (area > maxArea && conPoly.size() == 4) {maxArea = area;biggest = {conPoly[0]*2, conPoly[1]*2, conPoly[2]*2, conPoly[3]*2};}}}return biggest;
}Mat getWarp(const Mat& imOrigin, vector<Point> points) {Mat warpIm;Point2f src[4] = {points[0], points[1], points[2], points[3]};Point2f dst[4] = {{0.0, 0.0}, {0.0, 320.0}, {320.0, 320.0}, {320.f, 0.0}};Mat mat = getPerspectiveTransform(src, dst);warpPerspective(imOrigin, warpIm, mat, Point(320, 320));return warpIm;
}int main() {Mat imgOrigin = imread("warp-image.jpg");showIm(imgOrigin);Mat resizeIm;resize(imgOrigin, resizeIm, Size(), 0.5, 0.5);preProcess(resizeIm);vector<Point> recPoints = getContours(resizeIm);drawPoints(imgOrigin, recPoints);
//    reOrderPoints(recPoints);Mat imWrap = getWarp(imgOrigin, recPoints);showIm(imWrap);return 0;
}

原文做了点的重排列

我是根据显示图像点顺序确定四个点的顺序

原文链接

在 C++ 中使用 OpenCV 对图像中的对象进行扭曲透视

OpenCV透视变换示例相关推荐

  1. OpenCV 透视变换 图像拼接

    A:OpenCV 透视变换 一:OpenCV透视变换的概念 仿射变换(affine transform)与透视变换(perspective transform)在图像还原.图像局部变化处理方面有重要意 ...

  2. OpenCV透视变换应用于图像的实例(附完整代码)

    OpenCV透视变换应用于图像的实例 OpenCV透视变换应用于图像的实例 OpenCV透视变换应用于图像的实例 #include "opencv2/imgproc.hpp" #i ...

  3. OpenCV透视变换应用于图像的实例(附完整源代码)

    OpenCV透视变换应用于图像的实例 透视变换应用于图像的实例完整源代码 透视变换应用于图像的实例完整源代码 #include "opencv2/imgproc.hpp" #inc ...

  4. QT+OpenCV综合示例:图像混合(滑动条)

    QT+OpenCV综合示例:图像混合(滑动条) 1.代码: 2.运行结果: 0)Widget_op.ui (界面文件)设计: 1.代码: 1)opencv_imwrite_Q.pro 添加: INCL ...

  5. QT+OpenCV综合示例:载入、读取图片

    QT+OpenCV综合示例:载入.读取图片 1.代码: 2.运行结果: 下载1 GitHub: 下载2 1.代码: 1)opencv_imwrite_Q.pro 添加: INCLUDEPATH+= D ...

  6. 详解 OpenCV 透视变换原理 及 实例

    OpenCV提供了两种图片变换的方式:仿射变换和透视变换,两者的区别很容易区分, 前者是将矩形的图片变成平行四边形 后者是将图片变成梯形 这两种变换虽然都有各自的应用场景,但在实际的图片变换中由于透视 ...

  7. 使用OpenCV透视变换技术实现坐标变换实践

    1. 概述 1.1. 需求 在局部空间(无GPS定位)视频监控过程中,把视频识别到物体位置,投射到空间平面坐标系中,获取物体在局部空间的平面坐标. 1.2. 解决方案 使用图像透视变换技术. 1.3. ...

  8. opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用

    透视变换在图像还原的上的应用很广泛,他是将成像投影到一个新的视平面.比如两个摄像头在不同的角度对统一物体进行拍照,物体上的同一个点在两张照片上的坐标是不一样的,为了实现两张图片同一个点的对应关系映射, ...

  9. OpenCV——透视变换

    透视变换是按照物体成像投影规律进行变换,即将物体重新投影到新的成像平面,示意图如图所示.透视变换常用于机器人视觉导航研究中,由于相机视场与地面存在倾斜角使得物体成像产生畸变,通常通过透视变换实现对物体 ...

最新文章

  1. 省技术市场举办中小企业专利法律风险防范及专利战略制定讲座
  2. kernel: make tags 时的告警修改
  3. bzoj3714:[PA2014]Kuglarz
  4. java如何模拟请求_单元测试如何模拟用户请求
  5. 2018-2019-2 网络对抗技术 20165202 Exp9 Web安全基础
  6. FPGA数据传输模块设计
  7. 体脂数C语言switch,c语言switch语句
  8. Sparrow - Distributed, Low Latency Scheduling
  9. Installation of Ubuntu source-insight
  10. 女人如何获取安全感?
  11. 【WebService】Caused by: org.apache.cxf.transport.http.HTTPException: HTTP respon ...
  12. 图书管理系统(归还书籍)
  13. 数据查询和业务流分开_基于大数据的舆情分析系统架构 - 架构篇
  14. 浅谈心电信号处理(3)-- 心电滤波简述
  15. SCI论文阅读-深度学习在测井气体红外光谱定量分析中的应用
  16. android用服务建立悬浮窗,Android悬浮窗用法总结
  17. 摘抄整理-20161115-程序员思维修炼
  18. 电信网阵营 互联网阵营
  19. 对List的升序与降序排列函数sort()
  20. MCGS保存初值问题

热门文章

  1. 【字王看“字体的故事”】(字体的故事 《南方周末》)
  2. elementUI表格添加表头筛选条件
  3. 手机断触怎么办_苹果二手手机该不该买?行业大咖为你解答
  4. APP在线更新下载安装(转载)
  5. 二十一世纪大学英语读写教程(第四册)学习笔记(原文)——5 - Prison Studies(狱中学习)
  6. 苹果怒斥高通:高通偷了我们的创意 又反过来告我们
  7. C# Winform中使用 IHttpClientFactory的步骤介绍
  8. 2018物联网工程学院学生科协第一次公共培训之Office培训总结
  9. php自动加nofollow,WordPress自动外部链接加上nofollow标签且新窗口打开
  10. IDEA自定义POJO.groovy