自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 QT下配置OpenCV

因为之前一直在VS下使用OpenCV,VS下配置OpenCV的方法我用的是这位博主的文章opencv_contrib安装笔记然后我今天就像在QT中用OpenCV,有两种配置方法,一种是使用之前配置VS后已经生成的库文件,另一种是重新使用CMake生成QT的MinGW编译器使用的库文件,这里我就使用前一种方法,。首先新建一个QT控制台项目,在.pro项目文件中添加VS时候生成的库文件和头文件路径,代码如下:INCLUDEPATH += C:\opencv\opencv-build\install\in

2022-04-16 17:02:11 1583

原创 欧拉角,旋转矩阵和四元数之间的转换关系

引言因为关于欧拉角、旋转矩阵、四元数之间的转换关系有网上有很多人在讲,但是都比较乱,我专门自己梳理了一下。基本概念两个坐标系之间的转换关系的表示方法分别为欧拉角、旋转矩阵和四元数,具体概念我不在这个重复,可以查看别的博客。关于欧拉角有两个需要重点理解的内容:假设有一个参考坐标系和本体坐标系,它们之间成一定的角度这里重点阐述一下姿态角和欧拉角之间的联系和区别:欧拉角是一个坐标系分别绕坐标轴转动一定的旋转角得到另一个坐标系,姿态角特指运载体和地理坐标系之间的三个夹角,可以理解为姿态角是欧拉角的一种特

2022-04-14 10:38:56 3163 3

原创 OpenCV输出视频为MP4无法播放的问题

今天写了一段代码,打开一段视频,然后再使用CV::VideoWriter保存处理后视频,结果能够成功保存但是打不开。保存的代码如下:pVideoPro->SetOutput("output001.mp4");函数的内容如下所示/******************************保存视频****************************/bool VideoProcessor::SetOutput(const string& filename, int codec,

2022-04-09 10:48:18 6603

原创 初学OpenCV学习记录(十)

以下内容摘自《OpenCV2计算机视觉编程手册》引言本章内容主要是如何读取视频、处理和写入视频。读取视频序列视频其实就是一帧一帧的图像组成,这里的读取视频可以是视频文件或USB摄像头。使用到的类为cv::VideoCapture,创建一个对象,构造参数为视频文件的名称,则会自动打开视频,例如:cv::VedeoCapture capture("../bike.avi"),如果要读取USB摄像头,那么需要指定的是整数的ID号,而不是文件名。类中与读取视频序列相关的函数:isOpend():检查

2022-04-04 19:30:38 3467

原创 初学OpenCV学习记录(九)

以下内容摘自OpenCV2计算机视觉编程手册引言本章的内容主要是估算图像间的投影关系,包括对相机的内参矩阵和外参矩阵进行标定,计算不同视角的两张图片的基础矩阵,利用基础矩阵进行图像匹配和视角只进行旋转时候的单应矩阵计算。相机标定图像是由3D的场景投影到2D的平面,因此,场景中实际物体的三维坐标与它在图像中的二维像素有关系,这个关系就是我们对相机标定得到的内参和外参矩阵,这种关系是投影几何学的基础投影关系,在计算机视觉中也会使用。基本原理:定义3D参考坐标系原点为相机的投影中心(焦点),Z轴垂直于

2022-04-03 15:34:46 4165

原创 初学OpenCV学习记录(八)

以下内容摘自《OpenCV2计算机视觉编程手册》引言特征点(兴趣点、关键点)的概念被大量的用于解决物体识别、图像匹配、视觉跟踪、三维重建等问题,接下来介绍几种常见的特征点和在图像匹配中的应用Harris角点角点可以理解为顶点,在人造物体中随处可见,位于两条边缘的交点处,是可以用于精确定位的二维特征.基本原理:角点检测算法观察像素点周围一个邻域内的方向性强度的平均变化,邻域大小由参数定义,强度变化的平均值在所有可能的方向进行计算,我们首先获取平均强度变化最大值对应的方向,然后再检查位于它垂直方向的变

2022-04-02 13:45:10 944

原创 初学OpenCV学习记录(七)

以下内容摘自OpenCV2 计算机视觉编程手册引言书中本章介绍了运用形态学运算的几种算法,对图像的腐蚀、膨胀、开闭运算,以及利用上面的几种算法对图像进行边缘检测和角点检测,除此之外,还介绍了分水岭算法进行图像分割和GrabCut算法完成对图片前景和背景的分割。腐蚀、膨胀、开闭运算腐蚀:cv::erode()膨胀:cv::dilate()开闭运算:cv::morphologyEx()形态学滤波通常运用于二值图像,因此首先应该生成二值图像,形态学的惯例是用白色像素表示前景物体,黑色像素表示背景

2022-04-02 10:11:52 1336

原创 初学OpenCV学习记录(六)

以下内容摘自《OpenCV2计算机视觉编程手册》引言本章主要介绍了一种更优秀的检测轮廓的方法:Canny算子,如何使用霍夫变换检测直线、圆等形状,直线拟合,提取轮廓,计算连通区域形状描述符。使用Canny算子检测轮廓在前面我们已经使用过很多种方法检测图像的轮廓,前面的算法最后生成的二值轮廓图主要的问题在于二值化的过程中,如果阈值选的过低,则会检测出很多不重要的边缘,并且检测到的轮廓也过宽,不利于精确定位物体,如果阈值过高,则有可能忽略重要的边缘,使用Canny算法即可以很好的解决这个问题。基本原理

2022-04-01 17:00:23 907

原创 初学OpenCV学习记录(五)

以下内容摘自OpenCV2计算机视觉编程手册引言图像滤波是图像处理的一个基本操作,本章介绍几种常用的滤波器和他们的用途。图像的频率:不同的图像之间的颜色或者灰度分布不同,我们是从分布的角度来看的,如果我们从灰度的变化角度来看,有些图像的灰度变化缓慢,比如一片蓝色的天空,而有些图像灰度变化迅速,比如有很多物品的热闹场景,因此,图像中像素的变化频率构成了另一种描述图像的方式,低频对于图像变化缓慢,高频对应强度变化迅速,滤波的操作就是针对图像某一频段进行操作的。使用低通滤波器模糊图像目的:使用低通滤波

2022-04-01 10:02:59 971

原创 初学OpenCV学习记录(四)

以下内容摘自OpnCV2 计算机视觉编程手册引言图像是由像素组成的,像素值在图像中的分布情况是这幅图像的一个重要特征,因此可以使用直方图对像素值进行统计。直方图就是一个表,它给出一幅图像或一组图像拥有给定值的像素的数目。例如:在一个单通道的灰度图像中,灰度值的值介于0-255之间,我们统计该图像的直方图就可以由256个容器,0号容器表示灰度值为0的像素的数目,1号容器表示灰度值为1的像素的数目,依次类推。前置内容彩色图像有RGB三个通道,每个通道的强度值都是一个8位的uchar值,范围为0-25

2022-03-30 16:07:18 464

原创 初学OpenCV学习记录(三)

以下内容摘自OpnCV2 计算机视觉编程手册测试一段代码的运行时间代码如下:double duration;duration=static_cast<double>(cv::getTickCount()); //getTickCount函数获取开机算起的时钟周期数//此处添加被测试的代码duration=static_cast<double>(cv::getTickCount())-duration;duration/=cv::getTickFrequency(

2022-03-29 15:54:55 1166

原创 初学OpenCV学习记录(二)

以下内容摘自OpenCV2 计算机视觉编程手册大多数图像处理中,我们需要遍历图像的所有像素,接下来介绍遍历循环的方式(以三通道的彩色图像为例)存储方式在一个彩色图像中,图像数据缓冲区的前三个字节对应图像左上角像素的三个通道值,接下来三个字节对应第一行的第二个像素块,以此类推,出于效率考虑,有些图像每行会填补一些额外像素方便一些多媒体芯片处理数据,如果没有填补像素,则图像的有效宽度等于真实宽度。本节用到的相关参数成员变量:rows 图像的高度(像素的行数)cols 图像的宽度(像素的列数)

2022-03-29 15:01:17 800

原创 初学OpenCV学习记录(一)

以下内容多数摘自《OpenCV 2计算机视觉编程手册》载入、显示及保存图像表示图像的类型:cv::Mat相关函数:imread():读取图像,输入参数为文件名称namedWindow():定义需要显示图像的窗口,输入参数为窗口的名称imshow():显示图像,输入参数1为用于显示的窗口名称,参数2为要显示的图像变量imwrite():保存图像,输入参数1为保存以后图像的名称,后缀名决定了保存格式,参数2为要保存的图像变量代码如下:cv::Mat image;image=cv::imre

2022-03-29 13:25:33 73

原创 Qt学习之TCP/IP网络编程

1 引言测控系统中不同电脑和电脑之间需要用网络进行通信,基于TCP/IP协议下我们利用QTcpSocket套接字类和QTcpServer类设计服务器端和客户端的程序。2 准备工作在工程文件中添加QT+=network在头文件中添加#include <QTcpServer>#include <QTcpSocket>3 客户端编程(1)连接服务器设计好客户端界面以后,定义一个套接字对象用于通信:QTcpSocket *MyClientSocket;连接服务器

2022-03-20 20:14:59 553

原创 Qt学习之定时器QTimer类编程

1 引言在进行控制系统上位机编程时,我们经常需要用到定时器,在定时服务函数中执行控制动作或者显示数据等,编程时候使用到的类是QTimer类,我们要创建两个定时器,第一个定时器是在对话框的界面线程中创建的,他的定时事件在主循环中进行,而第二个定时器是在一个子线程中创建的,它的定时事件在子线程中循环,不受主线程其他事件的影响,我认为如果程序对于定时精度要求高的话,最好采用第二种设计方法,如果是诸如显示数据之类的对定时精度要求不高的动作,则可以采用第一种设计方法,更加省时省力。2 准备工作定时器需要用到QT

2022-03-17 17:11:34 6369

原创 Qt学习之使用QSetting类设置配置文件

1 引言在做工程项目时,我们经常有些需要配置的参数,比如说串口的波特率、端口号、停止位、数据位等信息,使用QSetting类可以将一些我们需要的参数写入一个inc格式的配置文件,保存在计算机中,如果下次打开应用程序,就可以直接读取配置文件中的相关参数,另外,如果在程序运行过程中修改了配置参数,那么一定要更新配置文件中的内容。接下来,我将设计一个简单的例子,配置文件中存储的是两个控制器的Kp、Ki、Kd参数。2 准备工作添加QSetting的头文件#include <QSettings>

2022-03-15 20:53:04 4580

原创 基于QT5的串口通讯编程学习

1.准备工作使用QT封装的串口通讯类,QSerialPort类中包含了对串口的相关操作,QSerialPortInfo类中包含了串口的相关信息,首先将这两个类包含到头文件中,另外需要在项目的.pro文件中添加serialport库,如下所示:#include<QSerialPort>#include<QSerialPortInfo>QT +=serialport2.使用UI设计界面设计窗口通常我们需要:一个Combox控件:用于选择串口号。两个Butt

2022-03-15 14:36:26 3857

原创 关于CString的两个注意事项

1.CString 字符串是以\0结尾的,在使用getbuffer(…)函数分配字节时候,必须多分配一位,但使用getlength获取长度时候是不包括\0的,另外,如果使用了getbuffer(…)以后,必须使用releasebuffer()函数,否则无法获取这个CString的字符串长度,也不能对他进行一些别的操作。2.我在类中使用了CString作为成员变量,却总是出现内存越界,看到一篇博客结构体中用到了CString类型说结构体中CString类型受到很多限制,我觉得类也同理,所以尽量不要在类中使用

2021-04-17 19:45:20 366

原创 Windows环境下的RTX实时操作系统学习记录

在一次编程的时候,debug结束以后无法终止调试,甚至没法关机,找了一番原因,原来是我在主函数的while循环中没有延时,导致不停的按照最小时间间隔在运行,没有办法终止调试,解决方法:1.编程时避免过小的时间间隔 2.在合适的地方增加ExitProcess()退出进程...

2020-12-11 10:07:57 2794 1

原创 基于MFC使用HighSpeedCharting动态显示曲线中的鼠标问题

当我在MFC中使用HighSpeedCharting动态绘制曲线时,每次在绘制过程中如果将鼠标移动到控件上,就会崩溃,最后,在资源视图中,选中控件,右键,属性,将行为中的Disabled设置为True,则控件被禁止,无法接受键盘和鼠标输入。...

2020-10-07 20:13:07 608 1

原创 MFC中CString的Format注意事项

今天在使用字符串转化为CString类型时候,始终显示错误,具体代码如下使用这种方式,显示str是错误的,找了好久终于在一篇博客中发现了问题添加链接描述修改代码显示成功

2020-10-06 20:18:32 292

原创 MFC数据类型

MFC中常用的数据类型数据类型意义BOOL布尔值BSTR32位字符指针BYTE8位无符号整数COLORREF32位数值,代表一个颜色值DWORD32位无符号整数LONG32位有符号整数LPARAM32位数值,作为窗口函数或callback的一个参数LPCSTR32位指针,指向一个常数字符串LPSTR32位指针,指向一个字符串LPCTSTR32位指针,指向一个可以移植到Unicode和DBCS的常数字符串LP

2020-10-04 15:41:37 381

原创 基于MFC的多进程通信

在使用MFC进行多进程通信是,成功建立了共享内存和事件,通过memcpy_s函数去读写共享内存,使用窗口中的控件获得的数据类型是CString类型的,使用memcpy_s(p->mtr, MTORDATA_SIZE, sendstr, sendstr.getlength());或者指定CString的长度memcpy_s(p->mtr, MTORDATA_SIZE, sendstr, 10);每次只能写入共享内存1个字符,对程序进行了修改char str[10];int length = 1

2020-09-18 19:58:37 533

原创 C++ CreateProcess创建新进程始终无法成功的原因

res = CreateProcess(TEXT(“E:\rtx.exe”), NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);多次运行始终不能成功,使用GetLastError()函数得到错误代码为87,找了好久在一个问题的回答下才发现,原来是si,和pi在创建时没有初始化,修改为STARTUPINFO si = { sizeof(si) };PROCESS_INFORMATION pi = { 0 };运行成功...

2020-09-17 20:27:54 2262

原创 VS环境下静态链接库的生成和使用

1.生成静态链接库步骤 先打开VS,点击菜单栏的文件中的新建项目,在Windows桌面中找到静态库,修改名称,点击确定,可以看到生成了framework.h和pch.h两个头文件以及pch.cpp和 自定义名称.cpp两个源文件,在自定义名称的那个cpp文件中写入你想要静态链接的函数,在pch.h头文件中声明刚才在.cpp中写入的文件,例如 extern int getnum();(这里必须加extern),最后,点击菜单栏的生成中的生成解决方案,然后可以在工程目录下的DEBUG文件夹里找到相应的.li

2020-09-13 13:04:01 1300

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除