PixViewer
PixViewer是参照VS插件ImageWatch,基于Qt的开源图片查看工具,在ImageViewer V1.1.0的基础上,保留了图像像素灰度值查看、放大缩小及拖拽的基础功能,参照截图工具优化了图像ROI区域截取功能,增加了两张图像的对比功能。
1 基础功能
PixViewer的初衷是做一个类似于VS中图像查看插件Image Watch的软件,不需要每次打开VS查看图像中的像素值,因此基础功能做的就是图像查看相关,具体如下:
功能
说明
图像查看
加载单通道或三通道图片,软件下方状态栏依次显示:当前鼠标点的图像坐标及像素值、图像放大比例、图像尺寸。
像素值查看
鼠标在图像上移动查看不同位置像素值,放大比例超过64时像素点灰度值绘制在图像中
移动;放大缩小
鼠标左键拖动图片可在窗口中移动;鼠标滚轮向前、向后滚动进行放缩,每滚动1次放大比例为1/0.707
居中查看
菜单栏中居中按钮,自动调整图像放大比例适应窗口大小
2 截图功能
相较1.1.0版本,参照主流截图软件逻辑对ROI区域截取进行了升级,点击菜单栏截取按钮后进入截取图像区域功能,图像增加 ...
日记测试
1b693c4938223286468132b2f7068bf6a3cbf33eba745d7a1a915b7ef7f18783ae98410e28fc01fd2412c80b0c8e33de
您好,这里需要密码。
Qt折线图
记录QCharts绘制折线动态图的流程,效果如下:
1 UI文件建立
新建一个 UI 文件后,在界面上添加一个graphicsView控件,并右键“提升为”,将其从基类 QGraphicsView 提升到 QChartView(setChart 是 QChartView 的成员函数)。
2 程序实现
首先需要添加模块charts(VS中是在扩展的 Qt Project Settings 的 Qt Modules 中添加charts)。然后添加对应的头文件:
123456#include <QtCharts>QT_CHARTS_USE_NAMESPACE#include <QChartView>#include <QLineSeries>using namespace QtCharts;
使用时在类中定义折线图和坐标轴等数据,然后在初始化函数中对折线图的样式进行自定义设置。
1234567891011class QLineChart : public QWidget{ double maxVal;//数据中的最大值,用于确定y轴上限范 ...
相机标定
相机标定,是图像测量和机器视觉应用时,绕不过去的关键步骤。通过标定,可以获得相机成像几何模型的参数,也就是三维空间中点与二维图像中点的对应关系。
1 相机成像模型
相机成像,实际上是一个光学成像过程。将相机的镜头组看作一个凸透镜,光线通过透镜在感光元件(CCD/CMOS)上成像,感光元件将光电信号转换为数字信号,再经数字信息处理(DSP)成数字图像,存储到存储介质当中。
透镜成像原理如下图,凸透镜的中心为光心,光线平行于主光轴(虚线)穿过透镜时,会汇聚到焦点,然后折射成像。其中,a为实物,u为物距;a1为成像,v为相距;f为焦距,表示焦点到光心的距离。
当相机感光元件位于凸透镜焦点附近,焦距与光心到感光元件距离无限接近时,即f≈vf\approx vf≈v,相机成像模型就成了我们熟悉的「小孔成像」。
2 坐标系转换
相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。相机标定的主要工作就是求解三维世界坐标系空间的点到二维像平面的转换关系,总的转换公式如下:
zc[uv1]=[fdX0u000fdYv000010][RT01][xcyczc1]z_{c} ...
LIBSVM2 工具及验证
LIBSVM2 工具及验证
官方下载的文件中tools和windows文件夹下面分别放置了LIBSVM的一些工具及打包好可用的程序,可以用来测试及使用LIBSVM,下面记录LIVSVM工具的使用及封装的LIBSVM库的测试。
1 工具
1.1 subset.py
第一个工具是subset.py,它的主要作用是将数据集进行分解,一部分做训练集一部分做测试集。使用的方法首先要在tools文件夹下面启动cmd程序,一个方法是打开cmd然后一步一步cd到当前文件夹,另一个方法就是在文件夹目录显示的地方输入cmd然后回车。
subset的运行命令如下,opetion为可选设置,0代表按照原顺序,1代表随机顺序,dataset 代表要划分的数据文件,number 表示第一个自己的数目。[output1]表示第一个子集,数目为number ,[output2]为另一个子集。例子中运行命令后就会将数据分成两部分,svmguide2.train.txt里面有200个数据,svmguide2.test.txt是剩下的数据。
12python subset.py [options] dataset num ...
OpenCV findContours
OpenCV 轮廓算法
findContours() 作为常用的轮廓分割函数,通常在 Canny() 边缘提取之后或者二值化之后获取物体轮廓。下面简单记录其算法原理,并记录其 API 参数含义及使用方法。
1 算法原理
OpenCV 中 findcontours 的算法原型为 suzuki 算法,源码地址为 click。对于二值化图像,只有 0 和 1 两种,遍历过程前首先定义一个记录边界层次关系的值 NBD,并将其初始化为 1,遍历时就是需要改变前景像素层次关系的值来进行轮廓提取。
1.1 遍历图像
算法的第一步是寻找一个轮廓的起始点,方法就是通过定义核遍历图像。首先定义左边是 0 右边是 1 的 kernel (外部边界)及左边是 1 右边是 0 的 kernel(内部边界),使用这两个 kernel 从左到右从上到下遍历图像,找到第一个满足要求的点认为是该轮廓的起点,后面的步骤就是从这个起点出发进行轮廓追踪。
1.2 轮廓追踪
找到轮廓起点后,将计数值 NBD 加一表示这是一个新的轮廓。进行轮廓追踪简单来讲就是围绕当前点进行顺时针或者逆时针的遍历,进而寻找到下一个轮廓点,之后不 ...
QT 关于namespace Ui
QT 关于namespace Ui
1 ui文件原理
在 Qt 中,可以使用Qt Designer 来快速设计界面,只需拖放就可以设计并快速浏览样式,并且可以生成代码,替代了用代码设计界面的工作。其主要原理是通过uic 工具将 ui 文件转换为了 ui_xxx.h代码文件。下面通过简单的例子记录 QT 关于 ui 文件的代码原理。
在 VS2019 + QT5.15 的环境下简单新建一个 widget,并在窗口中添加一个 label 和一个 pushbutton。
首先来查看MyWidget.h文件。首先是宏Q_OBJECT,它的作用是提供信号槽机制等 QT 操作,凡是 QObject 类都需要在第一行代码写上 Q_OBJECT。然后是类的私有成员Ui::MyWidgetClass ui;,这里的 MyWidgetClass 和我们自己定义的 MyWidgetClass 类并不是同一个,它是 Ui 命名空间下的,具体是在 “ui_MyWidget.h” 文件。
在 VS 中 ui 直接是类对象,而在 Qt Creator 中一般是指针,按照我目前的理解,定义为指针是利用 PIMPL设 ...
Qt多线程
使用Qt编写程序时,为了避免耗时操作导致界面“假死”以及并行计算提高程序运行速度,我们需要使用多线程,下面记录四种多线程使用的方法。
1 QThread
第一种方法是使用 QThread 类,具体使用步骤如下:
需要创建一个线程类的子类,让其继承 QT 中的线程类 QThread,比如:
1234class MyThread:public QThread{ ......}
重写父类的 run () 方法,在该函数内部编写子线程要处理的具体的业务流程,run 对于线程的作用相当于 main 函数对于应用程序。它是线程的入口,run 的开始和结束意味着线程的开始和结束。
12345678910class MyThread:public QThread{ ...... protected: //run()函数是一个虚函数,让创建的子线程执行某个任务,需要写一个子类让其继承 QThread,并且在子类中重写父类的 run() 方法,函数体就是对应的任务处理流程 void run() { ........ ...
C++ Libraries
C++中的链接库是写好的、可复用的代码,以一种可执行代码的二进制形式存在,可以被操作系统载入内存执行,Windows平台下有静态链接库(lib)和动态链接库(dll)两种。
静态链接库使用时链接器从其中获取所有被引用的函数,并将库同代码一起放到exe可执行文件中 ,其运行效率高。但对程序的更新部署和发布很不友好:假如一个模块依赖20个模块,当20个模块其中有一个模块需要更新时,需要将所有的模块都找出来重新编译出一个可执行程序才可以更新成功。
动态链接库不仅包含dll文件,也包含一个lib文件,但它的lib文件仅包含在运行时定位dll文件中函数的可执行代码所需的信息。其运行时进行链接,运行时同时存在exe文件和dll文件。相较于静态链接,动态链接在程序更新时只需要更新对应模块的dll文件,无需所有模块重新编译。
1 静态链接库使用
静态链接库的使用需要用到.lib文件及其对应的.h头文件,其中.h文件中包含静态库中可以使用的函数的声明,需要使用include进行包含。include包含头文件有双引号和尖括号两种形式,其形式与msvc在编译的时候搜索头文件的顺序有关,其顺序如下:
用双引 ...
OpenCV三角测量
使用OpenCV的三角测量可以根据立体标定得到的相机参数,以及一个特征点在左右两个相机中的像素坐标,求解得到该特征点的三维世界坐标(z坐标即深度信息)。
使用双目相机进行立体重建时,利用物体点-光心-像点三者共线的原理,在找到左右匹配的像点并且完成去畸变之后,就能够在三维空间中形成两条直线,物体点就是这两个直线的“交点”,“交点”指最小二乘交点,因为这两个直线由于偏差通常不会交于一点。
1.测量原理
相机成像过程中,从世界坐标系到相机坐标系的转换式为式(1),从像素坐标系到相机坐标系的转换为式(2)
[xcyczc]=[R11R12R13TxR21R22R23TyR31R32R33Tz][XYZ](1)\begin{bmatrix}x_{c}
\\y_{c}
\\z_{c}
\end{bmatrix}=\begin{bmatrix}
R_{11} &R_{12} &R_{13} &T_{x} \\
R_{21} &R_{22} &R_{23} &T_{y} \\
R_{31} &R_{32} &R_{3 ...