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

news/2025/1/12 23:31:05/文章来源:https://www.cnblogs.com/qq21497936/p/18520429

需求

  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运行包

  在这里插入图片描述

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

  在这里插入图片描述

  在这里插入图片描述

 

模块化部署

  在这里插入图片描述

关键源码

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);
}
...
 

入坑

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

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

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

相关文章

项目实战:Qt+OpenCV仿射变换工具v1.1.0(支持打开图片、输出棋盘角点、调整偏移点、导出变换后的图等等)  《项目实战:Qt+Opencv相机标定工具v1.3.0(支持打开摄像头、视频文件和

需求1.打开图片;  2.矫正识别角点;  3.opencv摄像头操作子线程处理;  4.支持设置棋盘格的行列角点数; 背景深入研究图像拼接细分支算法,产出的效果查看工具,验证算法单步思路。 相关博客《项目实战:Qt+Opencv相机标定工具v1.3.0(支持打开摄像头、视频文件和网络地…

软件开发中,做产品与做项目有什么区别

产品开发和项目开发的区别主要体现在:1.目标不同;2.开发过程不同;3.涉及人员不同;4.时间周期不同;5.结果测评不同。总的来说,产品开发更多侧重于满足市场需求和用户体验,长期维护并进行持续优化;而项目开发更注重完成特定的任务,达到预定的目标。1.目标不同 产品开发的…

SSHD服务

1.sshd服务 1.0 故障案例:openssh删除了本地连接物理服务器 ,通过远程控制卡连接.本地连接云: 登录web页面,连接.解决连接后安装openssh,软件包,直接apt/yum安装预防删除之前准备好备用方案.Telnet1.1 目标 1.修改sshd服务端配置文件修改ssh端口号,修改ssh禁用root远程登录. 2.…

BFS(Breath First Search 广度优先搜索)

BFS(Breath First Search 广度优先搜索)@目录一、知识及框架二、案例说明案例1:使用bfs计算二叉树的最小高度案例2:解开密码锁的最少次数,要求:请写一个算法,初始状态为0000,拨出target的最少次数,其中避免出现deadends中的包含的任意一个死亡密码,如果永远无法拨出tar…

MySQL安装-CentOS系统

MySQL安装-CentOS系统本文在此只介绍一种安装方式,是rpm并非yum。如果需要yum的安装方式,可以查阅其他相关资料 1.去官网下载对应的安装包 官方网站:https://www.mysql.com/,找到下载DOWNLOADS,下载操作系统对应的社区版本。本文使用的数据库版本是5.7.41在社区版本下载界…

洛谷题单指南-字符串-P3369 【模板】普通平衡树

原题链接:https://www.luogu.com.cn/problem/P3369 题意解读:平衡树的基本操作,模版题。 解题思路: 1、二叉搜索树-BST 二叉搜索树满足这样的性质:每一个节点的权值大于它的左儿子,小于它的右儿子。 对BST进行中序遍历,将得到一个从小到大的有序序列,因此BST是为了维护…

vscode调式LUA(EmmyLua)

安装EmmyLUA插件或者在github中下载 https://github.com/EmmyLua/VSCode-EmmyLua https://github.com/jiehuali/VSCode-EmmyLua.git 增加调试Launch.json 打开文件夹后会变成create a launcher.json,点击Run And Debug, 选择EmmyLua New Debugger(这个是作者推荐的,更稳定些…

TSP问题-分支限界法求解

此为课题组所指导本科生和低年级硕士生学习组合优化问题汇报 所用教材:北京大学屈婉玲教授《算法设计与分析》 课程资料:https://www.icourse163.org/course/PKU-1002525003 承诺不用于任何商业用途,仅用于学术交流和分享 更多内容请关注许志伟课题组官方中文主页:https://…

专有云是什么

专有云,或称私有云,是一种仅供特定组织或企业使用的云计算环境。本文将介绍以下几个方面:1、专有云的定义与特性;2、专有云与公有云的对比;3、专有云的应用场景;4、如何构建和管理专有云。在定义与特性部分,我们将详细探讨专有云如何通过提供独享的资源和高度定制的服务…

”回溯算法“框架及练习题

”回溯算法“框架及练习题@目录一、回溯算法是什么?二、框架如下:本人其他文章链接 一、回溯算法是什么? 结论:回溯 = 穷举 解决一个回溯问题,实际上就是一个决策树的遍历过程路径:就是已经做出的选择 选择列表:就是你当前可以做出的选择 结束条件:就是base case条件,…

Golang 开源库分享:faker - 随机生成有趣的假数据!

GitHub 仓库链接:https://github.com/bxcodec/faker 简介 在开发和测试过程中,我们经常需要各种各样的测试数据。如果手动去生成这些数据,不仅耗时,还容易出错。faker 是一个 Go 语言的假数据生成库,可以快速生成各种字段的随机数据。这个库可以帮我们轻松生成各种属性的假…

ShellScript

StorageSrvShelScript 编写添加用户的脚本,存储在/shells/userAdd.sh目录。 当有新员工入职时,管理员运行脚本为其创建公司账号。 自动分配客户端账号、公司邮箱、samba目录及权限、网站账号等。 以userAdd lifei的方式运行脚本,lifei为举例的员工姓名前提条件 完成了LDAP服…