机器视觉+图像处理+数字信号处理
文章平均质量分 62
介绍机器视觉和图像处理的各种算法和案例
liyuanbhu
这个作者很懒,什么都没留下…
展开
-
漫水填充算法填充图案 (C++)
从 stack 中取出一个点,把这个点填上颜色,然后判断邻近点有没有也是满足填充条件的点,有的话也填充上,并且存入 stack。另外被填充的图案中可有有些区域的颜色与我们要填充的区域的颜色一致。解决这个死循环问题我的办法是复制一份原始图像,在复制的图像中填充单色,在目标图像中填充图案。因为复制的图像填充的颜色和原始的颜色不同,所以就不会有死循环问题。下面是填充固定颜色的代码。在我的电脑上,填充速度也还可以,大概30-40ms 可以完成全部的填充计算。最后是填充后的效果,将原始图像红色的区域全都填充上头像。原创 2022-10-01 07:32:45 · 1120 阅读 · 0 评论 -
VisionMaster 学习笔记(仪表盘检测)
我们没有连接相机,所以图像源先选择本地的图片。项目上线的时候,图像源要换成一个真实的相机。项目用 VM 来实现很简单,可以作为一个 VisionMsater 的典型学习案例。这个项目简单的来说是在一个检测工位,代替人工,确认一个仪表的状态。只要这个仪表亮了,并且显示了些内容就是 OK 的,如果没亮,或者亮了但是没有显示内容,则是 NG 的。然后是颜色测量模块,这个模块有两处要设置。我们先把用到的几个模块拉进来,各个模块的参数先不用设置。对于背光没有亮的时候,通道1 的均值只有10几。之后就可以运行一下了。原创 2022-08-21 12:38:31 · 3437 阅读 · 4 评论 -
利用libdmtx 生成 DataMatrix 码
今天比较空闲,研究了 Libdmtx 生成 DM 码的方法。总体是比较简单的。这里附上代码做个记录。我的代码用到了 Qt 的 QPainter,没有考虑生成图片的效率问题。如果需要大批量生成 DM 码的图像,可以在 dmtxEncodeDataMatrix 调用之前设置 Libdmtx 的一些参数。这样可以做到dmtxEncodeDataMatrix 生成的数据就已经是图片的实际数据了,只要把数据copy到图像文件中就可以。我的代码是把相关的功能封装到了一个类。类的实现代码如下:这个代码还有很多不完原创 2022-06-18 23:01:37 · 1284 阅读 · 2 评论 -
Data Matrix 二维码解码库 libdmtx 编译方法
libdmtx 是一个开源的 Data Matrix 编解码库。项目主页在:https://github.com/dmtx这里简单记录一下libdmtx 在win平台上如何编译的问题。libdmtx 早期版本的源代码是不支持用微软的 VS 编译的,用 VS 编译需要改一些代码。当时在 win 上编译需要 mingw 或者 cygwin。不过新版的代码里面包含了 CMakeLists.txt 。说明已经使用了 CMake 作为编译管理系统。我试了一下,用 CMake 是可以生成 VS 的项目文件的,也能编译原创 2022-06-18 15:40:43 · 1479 阅读 · 7 评论 -
基于 FFMPEG 的视频编码 源码(libavcodec,C++ Qt)
基于 FFMPEG 的视频编码 源码(libavcodec,C++ Qt)昨晚把源代码好好整理了一下,加入了视频时间限制功能。源码放这里,大家随便用。首先是头文件:/****************************************************************************** file: VideoRecorder.h** brief: 利用 ffmpeg 实现视频录制** Copyright (C) LiYuan** Author: LiYuan原创 2021-12-28 11:08:00 · 3283 阅读 · 1 评论 -
基于 FFMPEG 的视频编码(libavcodec ,致敬雷霄骅)
基于 FFMPEG 的视频编码(libavcodec ,致敬雷霄骅)本文参考了雷博士的博客:最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))还参考了另一篇博客:Qt与FFmpeg联合开发指南(三)——编码(1):代码流程演示在为了代码简洁,代码中还用到了 Qt 。先不讲解具体的实现代码。大家先看看我封装后的类的使用方法。下面是一个简单的例子。这个例子先生成了一些 QImage 图像。然后把这些图像插入到视频中。#include <QCoreApplicat原创 2021-12-27 23:49:05 · 2547 阅读 · 0 评论 -
基于 FFMPEG 的视频解码(libavcodec ,致敬雷霄骅)
基于 FFMPEG 的视频解码(libavcodec ,致敬雷霄骅)本文参考了雷博士的博客:最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器基本上雷博士这篇博客已经把这个问题讲的挺清楚了。但是 ffmpeg 新版本的 API 有变化,这篇博客的代码已经无法直接编译运行。所以我写了今天这篇博客,用 新的 API 实现了视频解码的功能。雷博士的代码除了视频解码还有音频解码,同时还利用 SDL 把视频显示出来了。 我觉得作为初学者还是每次学习的内容不要太多。既然我们的重点是视频解码,那就原创 2021-12-12 13:10:19 · 5151 阅读 · 2 评论 -
基于 FFMPEG 的像素格式变换(swscale,致敬雷霄骅)
基于 FFMPEG 的像素格式变换(swscale,致敬雷霄骅)前几天写了几篇关于ffmpeg 编程转封装的入门文章,下一步本来是要写转码或者编码的。但是发现无论是转码还是编码,都会遇到图像像素格式的变换。我们通常能在软件界面上显示的图像,都是 RGB 格式的(RGB24 或者 RGB32)。但是视频文件中的图像基本都是 YUV格式的(YUV420p 或者 YUV422p)。为了能继续我后面的软件开发,就需要先补充些 YUV 格式的知识。还有 YUV和 RGB 直接相互转换的方法。关于 YUV 和 RG原创 2021-12-09 20:32:19 · 3593 阅读 · 0 评论 -
基于FFMPEG的音视频截取(C++Qt 版)
基于FFMPEG的音视频截取(C++Qt 版)这篇博客是基于上篇博客的:https://blog.csdn.net/liyuanbhu/article/details/121744275上篇博客实现了文件封装转换。我们在这个基础上再加一点功能。实现可以任意截取一段时间范围内的音视频。下面是代码:QlyAVFormatContext inFile, outFile;inFile.openFile(QString("D:\\AV36_1.avi"));inFile.dumpFormat();QS原创 2021-12-07 06:30:00 · 2124 阅读 · 2 评论 -
最简单的基于FFMPEG的封装格式转换器(C++Qt 版)
最简单的基于FFMPEG的封装格式转换器(C++Qt 版)这篇博客是我上篇博客的延续。建议大家先看看我上篇博客:https://blog.csdn.net/liyuanbhu/article/details/121715005之所以写这篇博客,是因为 ffmpeg 的 API 并不是那么友好。用面向对象的方式重新组织一下,代码会易读很多。下面先贴改写后的代码,大家可以比较一下,是否清爽了很多。 QlyAVFormatContext inFile, outFile; inFile.ope原创 2021-12-06 12:26:11 · 1197 阅读 · 1 评论 -
最简单的基于FFMPEG的封装格式转换器(致敬雷霄骅)
最简单的基于FFMPEG的封装格式转换器(致敬雷霄骅)最近项目需要,开始学习ffmpeg。网上资料很多,但是大多数资料都是几年前的。ffmpeg 的API 这几年变化蛮大的。按照网上的教程来写代码会遇到各种问题。所以我才想写这么一个专栏。用ffmpeg 比较新的 API 来把一些常用的功能都写一遍。我大概学习 ffmpeg 有一周多了。感觉学习 ffmpeg 有三个资源可以好好利用。机械工业出版社出版, 刘歧、赵文杰编著的《FFmpeg从入门到精通》雷霄骅 的博客 https://blog.csd原创 2021-12-04 13:58:40 · 4840 阅读 · 3 评论 -
OpenCV 学习笔记(mean shift 算法)
OpenCV 学习笔记(mean shift 算法)Mean shift 是一种机器学习算法,并不仅仅局限于图像上的应用。关于 Mean shift 算法介绍的书和文章很多,这里就不多介绍了。简单的说,Meanshift 算法是一种迭代算法,需要给一个初始的区域,然后这个算法会反复的调整这个区域,使得这个区域最吻合我们期望的特征。OpenCV 中有两处用到了 Mean Shift 。分别是:pyrMeanShiftFilteringmeanShift这里只介绍第二个函数的使用方法。我原创 2021-08-29 11:06:34 · 2555 阅读 · 3 评论 -
OpenCV 学习笔记(直方图反向投影 BackProject)
OpenCV 学习笔记(直方图反向投影 BackProject)上个笔记简单讲了讲如何计算直方图。这个笔记就来讲讲直方图的一种简单应用。直方图反向投影,是一种从图像中提取某个特定区域的方法。直方图可以理解为图像中各种颜色的分布情况,如果归一化了,就可以认为是一种概率分布。如果我们知道某个物体或者某个特征的直方图,也就是知道了这个物体各种颜色的分布概率。根据这个概率,我们可以根据图像中每一个点的颜色,都给一个 对应的概率。概率高的地方就更可能是存在这种物体的地方。概率为 0 的地方可以认为不存在这种物体。原创 2021-08-23 18:37:55 · 447 阅读 · 0 评论 -
OpenCV 学习笔记(颜色直方图计算 calcHist)
OpenCV 学习笔记(颜色直方图计算 calcHist)最近在看一本OpenCV 的书,书名是 《OpenCV 3 Computer Vision Application Programming Cookbook (third edition)》,里面给了很多很实用的代码片段。最近这几篇学习笔记都是从这个书里摘出的代码。有些代码我又做了些小的修改。直方图计算是个很常见的需求,OpenCV 当然也提供了想用的函数。不过OpenCV 里的函数搞的有点复杂。函数原型如下:void calcHist( In原创 2021-08-15 13:14:54 · 1199 阅读 · 1 评论 -
OpenCV 学习笔记(提取图像中特定颜色区域)
OpenCV 学习笔记(提取图像中特点颜色)我们经常需要提取图像中某种特殊颜色的区域,比如黄色或者红色区域。如果只是提取特点的颜色,那么很简单,直接做颜色比较就可以了。如果要选取某个颜色范围,这个工作在 RGB 空间中就不是那么方便了。这时我们通常会选取 HSV 或类似的颜色空间。关于 HSV 空间的介绍网上有很多,这里就不详细写了。但是可以认为 Hue 表示颜色,Saturation 表示颜色的饱和度,Brightness 是亮度。选取颜色范围时我们通常用 Hue 和 Sat 两个维度。下面是在网上原创 2021-08-14 22:47:48 · 16717 阅读 · 3 评论 -
OpenCV 学习笔记(Watershed)
OpenCV 学习笔记(Watershed)Watershed,中文一般翻译为分水岭算法。分水岭算法是一种图像区域分割算法,它把位置接近,灰度值也接近的像素点连接起来形成一个封闭的区域。关于分水岭算法的具体原理可以参考下面的网址:wiki 百科 Watershed这里只介绍在 OpenCV中的如何使用 Watershed 算法。Opencv 中 watershed函数原型如下:void watershed( InputArray image, InputOutputArray markers );原创 2021-08-04 13:40:21 · 3031 阅读 · 0 评论 -
OpenCV 学习笔记(重采样和图像缩放)
OpenCV 有两个函数,用来将图像尺寸缩小一半或扩大一半:pyrDownpyrUp这两个函数用来形成图像的高斯金字塔(Gaussian pyramid)。其中 pyrDown 用来将图像的尺寸缩小一半。函数原型如下:void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size());原理上这个函数是先做一个高斯低通滤波,然后再降采样。第三个参数 dstsize 是输出图像的 size,但是这个原创 2021-08-04 10:15:53 · 1942 阅读 · 0 评论 -
仿射变换 (Affine transform) 参数估计方法
仿射变换 (Affine transform) 参数估计方法最近一个机器视觉课题中的一个小问题。两幅图像中各有一些特征点,我们分别称为 (xi,yi)(x_i, y_i)(xi,yi) 和 (ui,vi)(u_i, v_i)(ui,vi)。这两组特征点可以由坐标的旋转和平移变换相联系。也就是说:(xiyi)=(cosθ−sinθsinθcosθ)(uivi)+(t1t2)\begin{pmatrix} x_i \\ y_i \end{pmatrix} = \begin{pmatrix}原创 2021-04-29 08:55:08 · 2086 阅读 · 1 评论 -
VisionMaster 学习笔记(颜色提取)
VisionMaster 学习笔记(颜色提取)颜色提取是个比较简单的功能,可以将图像中某个颜色范围内的区域给提取出来。比如我们有下面这么一幅图。我们要确定黄色的圆的位置。但是这个图像中有三个圆,怎么能去掉另外两个圆的影响呢。这就可以使用颜色提取。我们知道黄色是由红色和绿色组成的。那么我们只要提取出包含黄绿但是不包含蓝色的区域就行了。整个程序的流程如下:颜色抽取模块的参数如下,简单的说就是去找红绿大于200,蓝色小于50 的区域:颜色抽取模块输出的结果是个二值图,白色区域是提取出的区域。黑色是背原创 2021-02-07 16:13:25 · 4283 阅读 · 0 评论 -
VisionMaster 学习笔记(线圆测量)
VisionMaster 学习笔记(线圆测量)直线到圆的距离测量是一个比较常见的应用场景。利用海康的 VisionMaster 可以很方便的实现这个功能。下面就简单的介绍一下用法。我们的测试图如下,这个图和线线测量是一样的:这个是一个手机的 Cover Glass,我们要测量两个圆到 CG 底部的距离。程序的基本框架如下,1个直线查找,两个圆查找,然后就是线圆测量。直线查找上一篇博客里已经讲了,这篇就只讲讲圆查找。这里的参数与线查找差不多。边缘极性:有“黑到白”、“白到黑”以及“任意”三原创 2021-02-07 15:37:25 · 4548 阅读 · 0 评论 -
频谱、能谱、功率谱、倍频程谱、1/3 倍频程谱
在做声学信号处理时经常会遇到下面几个概念:能谱、功率谱、倍频程谱、1/3 倍频程谱。这些概念有区别也有联系。大家谈论问题时经常将其中一些概念混用。最近有点时间,我将这几种术语做一个梳理,记录在这里。其中,准确的说明功率谱密度的概念需要用到一点平稳随机过程的知识,考虑到多数人对随机过程不太了解,我这里尽量只用最简单的傅立叶分析的基本概念来说明,这样虽然不太严谨,但是对于我们平常的应用来说也够用了。原创 2015-01-13 14:07:11 · 59891 阅读 · 7 评论 -
信号频谱的几种表示方式及其关系
这里将连续信号和离散信号的频谱的几个式子总结在一起。方便使用时查阅。一个时域连续信号x(t),假设其能量有限,并且频域带宽有限,则可以对其进行傅立叶变换求其频谱。上面的式子中,X(Ω)称为信号的频谱。如果我们在频域用f来作为自变量。则上面的式子改写为:这两种频谱表示间的关系很简单。相应的,有所谓的能量等式:对连续信号进行采样,就得到了原创 2014-12-26 13:39:35 · 31468 阅读 · 0 评论 -
离散时间序列的内插算法(sinc 函数内插)
有些时候,为了后续处理更方便,我们需要对采集到的数据点进行内插处理,也就是所谓的增采样。本文就来讨论一下常用的几种内插算法。sinc 函数内插我们的信号 x(t) 是个实信号,带宽有限,能量有限。x[n] =x(nΔ)和 x’[n] =x(nΔ’)是对这个信号的两种采样,并且都满足采样定理的要求,也就是说信息并没有丢失。两次采样的采样率满足如下关系。也就是说第二种采样原创 2014-12-21 16:15:21 · 37504 阅读 · 8 评论 -
离散时间序列的内插算法(利用fft)
有些时候,为了后续处理更方便,我们需要对采集到的数据点进行内插处理,也就是所谓的增采样。本文就来讨论一下常用的几种内插算法。利用FFT实现信号内插我们的信号 x(t) 是个实信号,带宽有限,能量有限。x[n] =x(nΔ)和 x’[n] =x(nΔ’)是对这个信号的两种采样,并且都满足采样定理的要求,也就是说信息并没有丢失。两次采样的采样率满足如下关系。也就是说第原创 2014-12-20 21:59:29 · 11862 阅读 · 0 评论 -
推荐一本适合自学的小波分析教材
我大约在2年前就想自学小波分析,期间也看过几本小波分析方面的书。不过都是看到了某一章节就看不懂了。没办法,谁让我水平太低呢。简单的回忆了一下,我至少读过这几本小波分析方面的书: 崔锦泰 《小波分析导论》 这本书很有名,许多人都推荐。我读到了第三章,学会了积分小波变换,后面就看不懂了,卡在了二进小波上。徐长发《实用小波方法》 看完了前三章,第四章多分辨分析看到一半就看不懂原创 2014-12-07 16:39:34 · 26898 阅读 · 39 评论 -
麦克风阵列技术入门(5)
1.5. 近场声源的性质到目前为止,我们只考虑了远场声源。也就是声源距离麦克风阵列满足如下关系:在这个假设下,到达阵列的波可以认为是平面波。而实际应用上,经常是不满足这个条件的。近场条件下的Directivity pattern 的推导比较复杂,这里只讨论一维线性阵列条件下的水平面内近场声波的效应。图11是平面波入射时的波前的图示。图 11 平面波入射时的波前的图示翻译 2014-11-15 13:30:24 · 6683 阅读 · 1 评论 -
麦克风阵列技术入门(4)
1.4.2. 空间反走样 spatial aliasing与我们常见的Nyquist 采样定律类似,为了恢复信号在空间位置的上的变化,阵列在空间位置上的间距不能太大。在时间上,采样率fs (或者采样周期Ts)应满足:在空间上,我们有一个类似的结果:上式中,fxa是空间频率,fxmax是信号在空间中的最高频率。对于沿着x轴的空间频率来说:这个频率的最大值是:翻译 2014-11-15 09:43:12 · 7305 阅读 · 0 评论 -
麦克风阵列技术入门(3)
1.4. 离散传感器阵列传感器阵列可以认为是对连续孔径的空间采样。每一个传感器可以看做是一个连续孔径。阵列的响应为所有传感器响应的叠加。1.4.1. 一维传感器阵列我们这里考虑一种特殊的一种最简单的离散传感器阵列,一维传感器阵列,传感器的数量为奇数,如图6所示。 图 6 离散麦克风阵列每一个传感器的频率响应为en(f,x),传感器阵列的响应为每一个传感器响应的叠加。(2翻译 2014-11-15 09:37:35 · 9635 阅读 · 0 评论 -
GSL 学习笔记(快速傅立叶变换)
GSL 学习笔记(快速傅立叶变换)GNU Scientific Library (GSL)是一个开源的科学计算的函数库,里面实现了大量的数学函数,还提供了方程求解、傅立叶变换等多种功能。GSL 中FFT 的定义如下,正变换(forward):逆变换(inverse):还有一个叫做反向变换:反变换(backward):复数FFT,长度为2^N这是最简单的一种。C89标原创 2014-11-08 21:14:58 · 8936 阅读 · 3 评论 -
直接数字频率合成技术及其C++的实现
DDFS-Direct Digital Frequency Synthesizer 直接数字频率合成技术可以用来产生任意波形的周期信号。所谓的DDFS简单的说是查表法,内部维护一个Lookup Table储存一个周期的波形。那么这个查找表其实就是给出了相位到函数值的一个映射关系:这里相位ω又是时间t的线性函数。而调整输出频率实际上就是调整相位函数的系数kΔ。举个原创 2014-09-15 13:23:10 · 4816 阅读 · 2 评论 -
IIR 滤波器的实现(C++)
IIR 滤波器的实现(C++)最近在写的一个程序需要用到IIR滤波器,而且IIR滤波器的系数需要动态调整。因此就花了点时间研究IIR 滤波器的实现。以前用到的IIR滤波器的参数都是事先确定好的,有个网站,只要把滤波器的参数特性输进去,直接就能生成需要的C代码。http://www-users.cs.york.ac.uk/~fisher/mkfilter/trad.html一直都原创 2014-08-26 16:46:32 · 33367 阅读 · 24 评论 -
计算数字滤波器的频率响应 (2)
将上次的程序用C++重写了一遍。原创 2014-08-26 11:16:19 · 5448 阅读 · 0 评论 -
计算数字滤波器的频率响应
计算数字滤波器的频率响应的 C 代码。原创 2014-08-22 20:56:20 · 22765 阅读 · 2 评论 -
多项式计算的Horner 方法
Horner 算法是以英国数学家 William George Horner 命名的一种多项式求值的快速算法,实际上,这种快速算法在他之前就已经被Paolo Ruffini使用过了。而中国数学家秦九韶提出这种算法要比William George Horner 早600多年。P(x) 是一个多项式:我们希望计算x取某个特殊值x0时多项式的值p(x0).构造一个序列:原创 2014-08-19 10:54:08 · 19593 阅读 · 0 评论 -
一个简单的波形包络提取算法
最近做项目要提取一个声音信号的包络波形,所以花了点时间研究各种包络提取的算法。所谓包络检测又叫幅度解调,在许多领域都有重要的应用。如果载波信号是确定的,那么通常可以采用同步解调的方式,这种方式的信噪比最好,对信号中混入的噪声的抑制能力最强。所谓同步解调是通讯领域通常的叫法。在信号检测领域,这种方式通常称为“相敏检波”,锁相放大器(Lock-in Amplifier)采用的就是这种方式最典型的例原创 2014-07-29 11:23:15 · 54520 阅读 · 20 评论 -
麦克风阵列技术入门(2)
1.3. 连续孔径术语“孔径”指的是发射或接收波的空间区域。发射孔径也被称为主动孔径(active aperture),接收孔径称为被动孔径(passive aperture)。举例来说,在光学领域,孔径可以是一个不透明的隔板上的一个孔。在电磁学中,孔径可以表示电磁天线。声学领域,孔径可以表示一个将声信号转换为电信号的电声传感器(麦克风)或一个将电信号转换为声音号的设备(扬声器)。1.3.翻译 2014-03-31 13:38:49 · 10460 阅读 · 0 评论 -
麦克风阵列技术入门(1)
本文翻译自 Iain A McCowan 写的 Microphone Arrays, A tutorial。根据我自己的理解有些小的修改。摘要本文给出了麦克风阵列技术和波束形成理论的一些初步知识。所谓麦克风阵列就是放置在空间中不同位置的多个麦克风。根据声波传到理论,利用多个麦克风收集到的信号可以将某一方向传来的声音增强或抑制。利用这种方法,麦克风阵列可以将噪声环境中特定声音翻译 2014-03-31 13:15:56 · 18944 阅读 · 1 评论 -
利用FFT 计算生成离散解析信号
通常我们用到的信号都是实值信号,但是我们可以根据这个实信号构造出一个复信号,使得这个复信号只包含正频率部分,而且这个复信号的实部正好就是我们原来的实值信号。简单的推导可知,复信号的虚部是原信号的希尔伯特变换。这样构造出来的信号就叫做解析信号。因此,如何生成解析信号与如何对一个信号进行希尔伯特变换其实是等价的问题。获得解析信号后可以计算波形的包络、瞬时频率、相位等,是非常有用的。所以如何生成解析信号原创 2013-09-03 15:12:20 · 5199 阅读 · 0 评论 -
Savitzky-Golay 滤波器
Savitzky-Golay滤波器(通常简称为S-G滤波器)最初由Savitzky和Golay于1964年提出,发表于Analytical Chemistry 杂志。之后被广泛地运用于数据流平滑除噪,是一种在时域内基于局域多项式最小二乘法拟合的滤波方法。这种滤波器最大的特点在于在滤除噪声的同时可以确保信号的形状、宽度不变。信号的最小二乘平滑信号的最小二乘平滑的基本思想可以通过图1来说明。原创 2013-06-14 15:17:59 · 110274 阅读 · 32 评论 -
三角函数计算,Cordic 算法入门
三角函数计算,Cordic 算法入门三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来计算任意角度的三角函数的值。这种表格在人们刚刚产生三角函数的概念的时候就已经有了,它们通常是通过从已知值(比如sin(π/2)=1)开始并重复应用半角和和差公式而生成。现在有了计算机,三角函数表便推出了历史的舞台。但是像我这样的喜欢刨根问底的人,不禁要问计算机又是如何计算三角原创 2013-01-02 13:47:45 · 73488 阅读 · 56 评论