项目实战:Qt+OpenCV仿射变换工具v1.1.0(支持打开图片、输出棋盘角点、调整偏移点、导出变换后的图等等)

若该文为原创文章,转载请注明出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/143105881

长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

Qt开发专栏:项目实战(点击传送门)


需求

  1.打开图片;
  2.矫正识别角点;
  3.opencv摄像头操作子线程处理;
  4.支持设置棋盘格的行列角点数;


背景

  深入研究图像拼接细分支算法,产出的效果查看工具,验证算法单步思路。


相关博客

  《项目实战:Qt+Opencv相机标定工具v1.3.0(支持打开摄像头、视频文件和网络地址,支持标定过程查看、删除和动态评价误差率,支持追加标定等等)》
  《OpenCV开发笔记(〇):使用mingw530_32编译openCV3.4.1源码,搭建Qt5.9.3的openCV开发环境》
  《OpenCV开发笔记(三):OpenCV图像的概念和基本操作》
  《OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储》
  《OpenCV开发笔记(六):OpenCV基础数据结构、颜色转换函数和颜色空间》
  《OpenCV开发笔记(四十六):红胖子8分钟带你深入了解仿射变化(图文并茂+浅显易懂+程序源码)》
  《OpenCV开发笔记(七十六):相机标定(一):识别棋盘并绘制角点》
  《OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像》


Demo:affineTool_v1.1.0 windows运行包

  在这里插入图片描述

  在这里插入图片描述
  在这里插入图片描述

  在这里插入图片描述

  在这里插入图片描述
  CSDN粉丝0积分下载:https://download.csdn.net/download/qq21497936/89908724
  QQ群:博客首页扫码进入QQ技术群,点击“文件”搜索“affineTool”,群内与博文同步更新)


模块化部署

  在这里插入图片描述

关键源码

AffineManager.h

#ifndef AFFINEMANAGER_H
#define AFFINEMANAGER_H// opencv
#include "opencv/highgui.h"
#include "opencv/cxcore.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/xphoto.hpp"
#include "opencv2/dnn/dnn.hpp"
// opencv_contrib
#include <opencv2/xphoto.hpp>
#include <opencv2/ximgproc.hpp>
#include <opencv2/calib3d.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp>#include "cvui.h"#include <QImage>
#include <QTimer>class AffineManager: public QObject
{Q_OBJECT
public:explicit AffineManager(QObject *parent = 0);~AffineManager();public slots:void testOpencvEnv();                       // 测试环境public:cv::Point2f getLeftBottomOffsetPoint() const;cv::Point2f getCenterTopOffsetPoint() const;cv::Point2f getRightBottomOffsetPoint() const;int getChessboardColCornerCount() const;int getChessboardRowCornerCount() const;public:void setLeftBottomOffsetPoint(const cv::Point2f &offsetPoint);void setRightBottomOffsetPoint(const cv::Point2f &offsetPoint);void setCenterTopOffsetPoint(const cv::Point2f &offsetPoint);void setChessboardColCornerCount(int chessboardColCornerCount);void setChessboardRowCornerCount(int chessboardRowCornerCount);signals:void signal_srcImage(QImage image);void signal_srcImage(cv::Mat mat);void signal_resultImage(QImage image);void signal_resultImage(cv::Mat mat);void signal_inited(bool result);public slots:void slot_openImage(QString filePath);void slot_initImage();void slot_affineImage();protected:void initControl();protected:bool findChessboard(int rowCornerCount, int colCornerCount, cv::Mat &mat, std::vector<cv::Point2f> &vectorPoint2fCorners);public:static QImage mat2Image(cv::Mat mat);      // cv::Mat 转 QImageprivate:cv::Mat _mat;                       // 缓存一帧cv::Mat _resultMat;                 // 结果int _chessboardColCornerCount;      // 一列多少个角点int _chessboardRowCornerCount;      // 一行多少个角点private:                                // 计算内参和畸变系数cv::Mat _cameraMatrix;              // 相机矩阵(接收输出)cv::Mat _distCoeffs;                // 畸变系数(接收输出)std::vector<cv::Mat> _rotate;       // 旋转量(接收输出)std::vector<cv::Mat> _translate;    // 偏移量(接收输出)cv::Point2f _leftBottomPoint; // 仿射三点,对应原始cv::Point2f _rightBottomPoint;// 仿射三点,对应原始cv::Point2f _centerTopPoint;  // 仿射三点,对应原始cv::Point2f _leftBottomOffsetPoint; // 仿射三点,对应偏移cv::Point2f _rightBottomOffsetPoint;// 仿射三点,对应偏移cv::Point2f _centerTopOffsetPoint;  // 仿射三点,对应偏移
};#endif // AffineManager_H

AffineManager.cpp

...void AffineManager::slot_affineImage()
{cv::Point2f srcTraingle[3];cv::Point2f dstTraingle[3];srcTraingle[0] = _leftBottomPoint;srcTraingle[1] = _rightBottomPoint;srcTraingle[2] = _centerTopPoint;dstTraingle[0] = _leftBottomPoint  + _leftBottomOffsetPoint;dstTraingle[1] = _rightBottomPoint + _rightBottomOffsetPoint;dstTraingle[2] = _centerTopPoint   + _centerTopOffsetPoint;cv::Mat mat = cv::getAffineTransform(srcTraingle, dstTraingle);std::cout << srcTraingle[0] << srcTraingle[1] << srcTraingle[2] << endl;std::cout << dstTraingle[0] << dstTraingle[1] << dstTraingle[2] << endl;cv::warpAffine(_mat, _resultMat, mat, cv::Size(_mat.cols, _mat.rows));QImage image = mat2Image(_resultMat);emit signal_resultImage(image);
}
...

入坑

  算法的研究优化过程中,思路需要开拓编写代码,查看效果,逐步研究出算法的优化路径,坑多暂时未记录。


本文章博客地址:https://hpzwl.blog.csdn.net/article/details/143105881

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何解决JMeter响应数据乱码?

问题&#xff1a; 解决&#xff1a; 1、找到JMeter安装目录下的bin目录 2、 在bin目录下&#xff0c;打开" jmeter.properties "文件 3、搜索"sampleresult.default.encoding" 4、改成"sampleresult.default.encodingUTF-8"&#xff0c;去掉前面…

数字图像处理:图像分割应用

数字图像处理&#xff1a;图像分割应用 图像分割是图像处理中的一个关键步骤&#xff0c;其目的是将图像分成具有不同特征的区域&#xff0c;以便进一步的分析和处理。 1.1 阈值分割法 阈值分割法&#xff08;Thresholding&#xff09;是一种基于图像灰度级或颜色的分割方法&…

图片写入GPS经纬高信息

近期项目中需要往java平台传输图片&#xff0c;直接使用QNetworkAccessManager和QHttpMultipart类即可&#xff0c;其他博文中有分享。 主要是平台接口对所传输图片有要求&#xff1a;需要包含GPS信息&#xff08;经度、纬度、高度&#xff09;。 Qt无法直接实现&#xff0c;…

教育平台的创新设计:Spring Boot实现

3系统分析 3.1可行性分析 通过对本信息化在线教学平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本信息化在线教学平台采用Spring Boot框架&#xff0c;JA…

LINUX1.1

目录 文件夹 文件&#xff1a;存储数据 文件夹&#xff1a;文件的目录 操作系统&#xff1a;广泛应用于服务器、桌面、移动设备和嵌入式系统等领域 应用软件&#xff1a;Linux操作系统以其稳定性、安全性和灵活性著称&#xff0c;广泛应用于服务器、桌面、移动设备和嵌入式系…

【D3.js in Action 3 精译_037】4.1 DIY 实战:D3 源码分析之——d3.timeFormat() 函数

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

笔记:WPF中MarkupExtension使用的IServiceProvider参数都有哪些

一、目的&#xff1a;WPF中MarkupExtension使用的IServiceProvider参数都有哪些&#xff0c;都是做什么的 在 WPF 中&#xff0c;MarkupExtension 类的 ProvideValue 方法接受一个 IServiceProvider 参数。IServiceProvider 是一个服务定位器接口&#xff0c;允许你在运行时获取…

深入理解 Kafka

一、引言 在当今的大数据和分布式系统时代&#xff0c;高效的消息传递和处理是构建可靠、可扩展应用的关键。Apache Kafka 作为一种高吞吐量的分布式发布 - 订阅消息系统&#xff0c;在众多领域中发挥着重要作用。本文将深入探讨 Kafka 的核心概念、架构、工作原理、应用场景以…

Axure重要元件三——中继器修改数据

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;中继器修改数据 主要内容&#xff1a;显示编辑内容、表格赋值、修改数据 应用场景&#xff1a;更新行、表单数据行修改 案例展示&#xff1a; 正文…

前端算法合集-2(含面试题-美团一面)

主要考察的就是数组扁平化,由浅入深吧 ①利用tostring()和split() let arr [1, 2, 3, [4, 5, 6], [7, 8, [9, 10, 11], 12], [13, 14, 15]] let newarrarr.toString().split(,) let numarrnewarr.map((item)>{itemNumber(item)return item }) console.log(numarr) ②利用…

AndroidStudio移动开发:使用Service播放音乐【步骤】

目录 一、创建新application 二、准备音乐文件 三、创建项目和布局&#xff08;如果需要交互界面的话&#xff0c;这里简单假设一个基本布局&#xff09; 四、创建MusicService类 五、在MainActivity中启动和控制Service&#xff08;也可以另外创建MusicActivity类&#x…

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述&#xff1a; xdsec的小伙伴们和参赛者来上课&#xff0c;碰巧这一天签到系统坏了&#xff0c;作为老师的你&#xff0c;要帮他们 教师代签。 特殊提醒&#xff1a;luo同学今天好像在宿舍打游戏&#xff0c;不想来上课&#xff0c;这是严重的缺勤行为…

实现mysql定时执行任务

使用场景&#xff0c;每天想定时去执行一次数据同步&#xff0c;可以进行实现每天某个时间段去查询两个数据库表中数据进行数据同步 具体步骤包括两步&#xff1a; 先查看定时任务是否开启 SHOW VARIABLES LIKE event_scheduler; #查看是否开启&#xff0c;NO表示开启,默认是…

【数据分享】全国人口-人口年龄结构和抚养比(1990-2021年)

数据介绍 一级标题指标名称单位指标解释人口年末总人口万人年末人口数指每年12月31日24时的人口数。年度统计的全国人口总数内未包括香港、澳门特别行政区和台湾省以及海外华侨人数。1981年及以前人口数据为户籍统计数&#xff1b;1982、1990、2000、2010、2020年数据为当年人口…

Scala的多态

从编译的角度解释Scala的多态含义&#xff1a;在执行期间而非编译期间确定所引用对象的类型&#xff0c;根据实际类型调用其方法。一个编译型语言有两种类型&#xff0c;分别为编译类型和运行类型。程序中定义的引用变量所指向的具体类型和通过该变量发出的方法调用在编译时不确…

实操上手TinyEngine低代码引擎插件化开发

1.背景介绍 1.1 TinyEngine 低代码引擎简介 低代码开发是近些年非常热门的一种开发方式&#xff0c;用户可以通过可视化的方式&#xff0c;简单拖拽&#xff0c;不写代码或者编写少量代码&#xff0c;类似搭积木一样搭建业务应用。 TinyEngine是一个强大的低代码引擎&#x…

Redis 常用指令详解

Redis是一款开源的、高性能的键值对存储数据库&#xff0c;常用于缓存、会话存储以及其他需要快速访问的数据场景。本文将介绍Redis的一些常用指令&#xff0c;并通过代码示例进行说明。 一、连接操作指令 1. 连接 Redis 服务器 ./redis-cli -h 127.0.0.1 -p 63792. 认证&a…

计算广告第三版pdf

需要该书pdf版本的同学点赞&#xff0c;私信我&#xff1a;

拥抱云开发的未来:腾讯云数据库、云模板与AI智能化的应用场景探索

本文目录&#xff1a; &#x1f4a1;前言&#xff1a;技术的边界在不断延展&#x1f31f;目录&#x1f308;什么是腾讯云云开发&#xff1f;&#x1f4be;云数据库&#xff1a;让数据成为开发的稳固基石&#x1f951;数据&#xff0c;不再只是数据 &#x1f6e0;云模板&#xf…

Spark_入库时报错ORA-00001 unique constraint violated 解决办法

首先可能是数据入重复了 检查一下看看是否入库前删除了分区的数据&#xff0c;可能是重复数据入库的问题&#xff0c;如果不是这个那么继续排查。 入库的数据有问题&#xff0c;检测方法 如果报主键冲突了&#xff0c;则group by 一下id,date&#xff0c;然后select 的时候加一…