OpenCV透视变换示例
公众号推送看到的
由于深度学习平时训练的是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透视变换示例相关推荐
- OpenCV 透视变换 图像拼接
A:OpenCV 透视变换 一:OpenCV透视变换的概念 仿射变换(affine transform)与透视变换(perspective transform)在图像还原.图像局部变化处理方面有重要意 ...
- OpenCV透视变换应用于图像的实例(附完整代码)
OpenCV透视变换应用于图像的实例 OpenCV透视变换应用于图像的实例 OpenCV透视变换应用于图像的实例 #include "opencv2/imgproc.hpp" #i ...
- OpenCV透视变换应用于图像的实例(附完整源代码)
OpenCV透视变换应用于图像的实例 透视变换应用于图像的实例完整源代码 透视变换应用于图像的实例完整源代码 #include "opencv2/imgproc.hpp" #inc ...
- QT+OpenCV综合示例:图像混合(滑动条)
QT+OpenCV综合示例:图像混合(滑动条) 1.代码: 2.运行结果: 0)Widget_op.ui (界面文件)设计: 1.代码: 1)opencv_imwrite_Q.pro 添加: INCL ...
- QT+OpenCV综合示例:载入、读取图片
QT+OpenCV综合示例:载入.读取图片 1.代码: 2.运行结果: 下载1 GitHub: 下载2 1.代码: 1)opencv_imwrite_Q.pro 添加: INCLUDEPATH+= D ...
- 详解 OpenCV 透视变换原理 及 实例
OpenCV提供了两种图片变换的方式:仿射变换和透视变换,两者的区别很容易区分, 前者是将矩形的图片变成平行四边形 后者是将图片变成梯形 这两种变换虽然都有各自的应用场景,但在实际的图片变换中由于透视 ...
- 使用OpenCV透视变换技术实现坐标变换实践
1. 概述 1.1. 需求 在局部空间(无GPS定位)视频监控过程中,把视频识别到物体位置,投射到空间平面坐标系中,获取物体在局部空间的平面坐标. 1.2. 解决方案 使用图像透视变换技术. 1.3. ...
- opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用
透视变换在图像还原的上的应用很广泛,他是将成像投影到一个新的视平面.比如两个摄像头在不同的角度对统一物体进行拍照,物体上的同一个点在两张照片上的坐标是不一样的,为了实现两张图片同一个点的对应关系映射, ...
- OpenCV——透视变换
透视变换是按照物体成像投影规律进行变换,即将物体重新投影到新的成像平面,示意图如图所示.透视变换常用于机器人视觉导航研究中,由于相机视场与地面存在倾斜角使得物体成像产生畸变,通常通过透视变换实现对物体 ...
最新文章
- 省技术市场举办中小企业专利法律风险防范及专利战略制定讲座
- kernel: make tags 时的告警修改
- bzoj3714:[PA2014]Kuglarz
- java如何模拟请求_单元测试如何模拟用户请求
- 2018-2019-2 网络对抗技术 20165202 Exp9 Web安全基础
- FPGA数据传输模块设计
- 体脂数C语言switch,c语言switch语句
- Sparrow - Distributed, Low Latency Scheduling
- Installation of Ubuntu source-insight
- 女人如何获取安全感?
- 【WebService】Caused by: org.apache.cxf.transport.http.HTTPException: HTTP respon ...
- 图书管理系统(归还书籍)
- 数据查询和业务流分开_基于大数据的舆情分析系统架构 - 架构篇
- 浅谈心电信号处理(3)-- 心电滤波简述
- SCI论文阅读-深度学习在测井气体红外光谱定量分析中的应用
- android用服务建立悬浮窗,Android悬浮窗用法总结
- 摘抄整理-20161115-程序员思维修炼
- 电信网阵营 互联网阵营
- 对List的升序与降序排列函数sort()
- MCGS保存初值问题
热门文章
- 【字王看“字体的故事”】(字体的故事 《南方周末》)
- elementUI表格添加表头筛选条件
- 手机断触怎么办_苹果二手手机该不该买?行业大咖为你解答
- APP在线更新下载安装(转载)
- 二十一世纪大学英语读写教程(第四册)学习笔记(原文)——5 - Prison Studies(狱中学习)
- 苹果怒斥高通:高通偷了我们的创意 又反过来告我们
- C# Winform中使用 IHttpClientFactory的步骤介绍
- 2018物联网工程学院学生科协第一次公共培训之Office培训总结
- php自动加nofollow,WordPress自动外部链接加上nofollow标签且新窗口打开
- IDEA自定义POJO.groovy