首页 > 其他分享 >项目实战:Qt+OpenCV透视变换工具v1.1.0(支持打开图片、输出棋盘角点、调整偏移点、导出变换后的图等等)

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

时间:2024-11-13 21:08:35浏览次数:1  
标签:Qt 变换 void 角点 Point2f OpenCV dstTraingle include cv

需求

  1.打开图片;
  2.矫正识别角点;
  3.四点对应偏移距离;
  4.支持设置棋盘格的行列角点数;
  5.导出结果图片;

 

背景

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

 

相关博客

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

 

Demo:perspectTool_v1.1.0 windows运行包

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

  在这里插入图片描述

  在这里插入图片描述

  在这里插入图片描述

 

模块化部署

  在这里插入图片描述

关键源码

AffineManager.h

#ifndef PERSPECTMANAGER_H
#define PERSPECTMANAGER_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 PerspectManager: public QObject
{
    Q_OBJECT
public:
    explicit PerspectManager(QObject *parent = 0);
    ~PerspectManager();

public slots:
    void testOpencvEnv();                       // 测试环境

public:
    cv::Point2f getLeftBottomOffsetPoint() const;
    cv::Point2f getRightBottomOffsetPoint() const;
    cv::Point2f getLeftTopOffsetPoint() const;
    cv::Point2f getRightTopOffsetPoint() const;
    int getChessboardColCornerCount() const;
    int getChessboardRowCornerCount() const;

public:
    void setLeftBottomOffsetPoint(const cv::Point2f &offsetPoint);
    void setRightBottomOffsetPoint(const cv::Point2f &offsetPoint);
    void setLeftTopOffsetPoint(const cv::Point2f &leftTopOffsetPoint);
    void setRightTopOffsetPoint(const cv::Point2f &rightTopOffsetPoint);
    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_perspectImage();

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 转 QImage


private:
    cv::Mat _mat;                       // 缓存一帧
    cv::Mat _resultMat;                 // 结果
    int _chessboardColCornerCount;      // 一列多少个角点
    int _chessboardRowCornerCount;      // 一行多少个角点

private:                                // 计算内参和畸变系数
    cv::Point2f _leftBottomPoint;       // 透射四点,对应原始
    cv::Point2f _rightBottomPoint;      // 透射四点,对应原始
    cv::Point2f _leftTopPoint;          // 透射四点,对应原始
    cv::Point2f _rightTopPoint;         // 透射四点,对应原始

    cv::Point2f _leftBottomOffsetPoint; // 透射四点,对应偏移
    cv::Point2f _rightBottomOffsetPoint;// 透射四点,对应偏移
    cv::Point2f _leftTopOffsetPoint;    // 透射四点,对应偏移
    cv::Point2f _rightTopOffsetPoint;   // 透射四点,对应偏移

    bool _drawPoint;
};

#endif // PERSPECTMANAGER_H

AffineManager.cpp

...

void PerspectManager::slot_perspectImage()
{
    cv::Point2f srcTraingle[4];
    cv::Point2f dstTraingle[4];

    srcTraingle[0] = _leftTopPoint;
    srcTraingle[1] = _rightTopPoint;
    srcTraingle[2] = _rightBottomPoint;
    srcTraingle[3] = _leftBottomPoint;

    dstTraingle[0] = _leftTopPoint + _leftTopOffsetPoint;
    dstTraingle[1] = _rightTopPoint + _rightTopOffsetPoint;
    dstTraingle[2] = _rightBottomPoint + _rightBottomOffsetPoint;
    dstTraingle[3] = _leftBottomPoint  + _leftBottomOffsetPoint;

#if 0
    dstTraingle[0].x = dstTraingle[3].x;
    dstTraingle[0].y = dstTraingle[1].y;
    dstTraingle[2].x = dstTraingle[1].x;
    dstTraingle[2].y = dstTraingle[3].y;
#endif

    cv::Mat mat = cv::getPerspectiveTransform(srcTraingle, dstTraingle);

    LOG << "=============================================";
    LOG << "        左上点          右上点          右下点          左下点";
    LOG << "原始点:"
        << srcTraingle[0].x << "," << srcTraingle[0].y << ";"
        << srcTraingle[1].x << "," << srcTraingle[1].y << ";"
        << srcTraingle[2].x << "," << srcTraingle[2].y << ";"
        << srcTraingle[3].x << "," << srcTraingle[3].y << ";";
    LOG << "偏移后:"
        << dstTraingle[0].x << "," << dstTraingle[0].y << ";"
        << dstTraingle[1].x << "," << dstTraingle[1].y << ";"
        << dstTraingle[2].x << "," << dstTraingle[2].y << ";"
        << dstTraingle[3].x << "," << dstTraingle[3].y << ";";


    cv::warpPerspective(_mat, _resultMat, mat, cv::Size(_mat.cols, _mat.rows));

    QImage image = mat2Image(_resultMat);
    emit signal_resultImage(image);
}
 

入坑

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

标签:Qt,变换,void,角点,Point2f,OpenCV,dstTraingle,include,cv
From: https://www.cnblogs.com/qq21497936/p/18544822

相关文章

  • Qt | 串口调试工具实现
    点击上方"蓝字"关注我们01、QSerialPort>>>QSerialPort是Qt框架中的一个类,用于串行通信。它提供了一个简单的接口,允许开发者通过串口与外部设备(如传感器、相机、单片机等)进行数据交换。QSerialPort支持多种串口操作,可以方便地设置波特率、数据位、停止位和校验位等通......
  • 【Qt 蓝牙服务器实现】
    在Qt中实现一个蓝牙服务器可以使用QtBluetooth模块。下面是一个基本的蓝牙服务器示例,它能够接受来自客户端的连接。首先,请确保你已经安装了QtBluetooth模块并在项目文件中包含了相关库。1.项目文件(.pro)配置在项目文件中添加以下行,以确保包含QtBluetooth......
  • 【QT】解决生成的exe文件出现“无法定位程序入口”或“找不到xxx.dll”的问题
    【QT】解决生成的exe文件出现“无法定位程序入口”或“找不到xxx.dll”的问题零、问题使用QT编译好项目后,想直接在文件资源管理器中运行exe程序或想分享出去给别人使用发现出现如下问题:系统错误:找不到xxx.dll。无法找到入口:无法定位程序输入点xxx。下文将介绍如何解决以......
  • Python 第三方库 PyQt5 的安装
    目录前言PyQt5安装不同操作系统PyQt5安装一、Windows系统二、macOS系统三、Linux系统(以Ubuntu为例)安装PyQt5可能会遇到的问题一、环境相关问题二、依赖问题三、网络问题四、安装工具问题五、运行时问题六、环境配置问题七、安装源问题八、检查错误信息......
  • C++基础 抽象类 类模板 STL库 QT环境
    一、抽象类1、纯虚函数        在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容,因此可以将虚函数改为纯虚函数。        语法:virtual返回值类型函数名(参数列表)=0;2.抽象类1)概念        有纯虚函数所在的类,称......
  • 常用的物联网消息队列-Mqtt协议
    EMQX和Mosquitto都是广泛使用的MQTT消息代理,但它们在设计目标、功能和适用场景上有一些显著的区别。Emqx使用教程添加依赖<dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><version>1.2.5</......
  • Qt滑动条美化自定义
    效果展示主要代码头文件下面是hi控件的头文件,我们继承一个Qt原生的滑动条类QSlider,然后在基类的基础上进行自定义,我会对重要的变量进行解析:classXSlider:publicQSlider{Q_OBJECTpublic:explicitXSlider(QWidget*parent=nullptr);protected:......
  • css3D变换用法
    文章目录CSS3D变换详解及代码案例一、CSS3D变换的基本概念二、3D变换的开启与景深设置三、代码案例CSS3D变换详解及代码案例CSS3D变换是CSS3中引入的一种强大功能,它允许开发者在网页上创建三维空间中的动画和交互效果。通过CSS3D变换,你可以实现元素的3D位移、旋转......
  • Qt - 信号与槽的第五个参数
    connent函数第五个参数的作用connect(constQObject*sender,constchar*signal,constQObject*receiver,constchar*method,Qt::ConnectionTypetype=Qt::AutoConnection)第五个参数代表槽函数在哪个线程中执行:自动连接(Qt::AutoConnection),默认的连接方式,如果信号......
  • Matlab信号处理:连续小波变换
    小波变换是信号时频分析中浓墨重彩的一笔,本文将介绍连续小波变换(ContinuousWaveletTransform,CWT),对比短时傅里叶变换(STFT),CWT有更多的优势、更加灵活。区别于短时傅里叶变换的正弦基函数,连续小波变换采用小波基函数,通过调整小波基函数的尺度因子和时间平移因子,能分析信号在不......