
图像处理与机器视觉
文章平均质量分 58
czl389
我的github ID:czl389.
展开
-
全景图(一):使用Unity完成水晶球纹理贴图
本系列文章使用Unity来完成2D全景图的3D展示。Unity3D是虚拟现实开发中的强大工具,使用Unity生成360°图像或视频也非常方便,利用可视化工具和少量脚本代码(C#语言)就能轻松完成。下载和安装Unity可访问官网下载最新的个人版(免费)。官网提供的下载器,我使用的时候发生了异常。也可在此界面使用迅雷下载,Unity3d下载 ,版本是Unity5.5。下载下图圈有红线的条目,就够用了。安原创 2017-02-25 17:00:37 · 9352 阅读 · 0 评论 -
图像算法中的设计模式(二):用控制器设计模式实现功能模块间通信
在构建更复杂的程序时,你需要创建多个算法来协同工作,以实现一些高级功能。要合理地构建程序并让所有的类能互相通信,程序将会变得越来越复杂。因此在一个类中集中对程序进行控制,是非常有益的。这正是控制器设计模式背后的思想。以图像算法中的设计模式(一):使用策略模式设计算法 这篇博客里使用的颜色检测算法为例。设计一个Controller类,它的首要任务是创建执行程序所需的类。在这里只执行颜色检测这一算原创 2016-12-29 11:50:55 · 1677 阅读 · 2 评论 -
图像算法中的设计模式(一):使用策略模式设计算法
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。总体来说,一个设计模式就是一个可重用的、让代码更容易被他人理解的、可靠性的解决方案。 策略设计模式的目的就是把算法封装进类。封装后,算法之间互相替换,或者把几个算法组合起来进行更复杂的处理,都会更加容易。而且这种模式能够尽可能地将算法的复杂性隐藏在一个直观的编程接口之后,因而有利于算法的部原创 2016-12-29 10:47:50 · 1524 阅读 · 0 评论 -
Windows下QT Creator配置OpenCV(VC版)
Windows环境下的编程工具Visual Studio,调试功能很好用。之前是在VS上写调用OpenCV库的C++代码。现在有设计界面的需求,但是不喜欢VS自带的C++ GUI库MFC。所以选择了安装QT。写Qt程序,可以在VS中安装Qt插件,这是一种开发方式。但QT不只是个GUI库,它还具备像VS一样的IDE,叫 Qt Creator。这篇博客介绍QT Creator和OpenCV开发环境原创 2018-01-23 11:22:42 · 5722 阅读 · 0 评论 -
在Visual Studio下配置OpenCV的3种方式
这里以VS2013和OpenCV2.4.12为例。首先将OpenCV下载安装好,配置的过程可以分为两个步骤:一是设置环境变量;二是配置项目属性表。本文总结了网上所有的配置方式,设置环境变量这一步都一样,差异出现在配置属性表这一步上。因为修改属性表的位置不同,所以这里分为3种方式。设置环境变量首先设置环境变量。右击"我的电脑",单击"属性",打开一个页面。找到"高级系统设置",单原创 2016-12-26 09:30:57 · 5516 阅读 · 0 评论 -
OpenCV打开摄像头出现运行错误OpenCV Error:Assertion failed (size.width>0&&size.height>0)in cv::imshow,……
在运行打开摄像头并实时显示图像的程序中出现报错。开发环境为PC,摄像头为笔记本自带的网络摄像头。然而在更换并测试其它USB摄像头后程序正常。推测:是网络摄像头的原因吗?先调试代码,定位错误再说。实时显示图像通过一个while循环实现,在循环体中,先是VideoCaptrue::read,然后imshow();程序编译正常,运行时报错,并出现OpenCV Error:Assertio原创 2016-03-31 23:15:01 · 12177 阅读 · 3 评论 -
OpenCV特征检测出现Unhandled exception at……Access violation reading location 0x00000000.
OpenCV版本为2.4.12,Visual Studio 开发环境中运行。在图像特征检测、匹配中出现了运行错误:Unhandled exception at 0x569D1C00 (opencv_features2d2412d.dll) in Macher.exe: 0xC0000005: Access violation reading location 0x00000000.原创 2016-03-29 09:38:07 · 5151 阅读 · 0 评论 -
直接线性变换(DLT)求解单应性矩阵
在图像拼接中,得到了两张图像的特征匹配,两个点集分别记作XX和X′X'。用单应性变换来拟合二者的关系,可表达为 c⎛⎝⎜uv1⎞⎠⎟=H⎛⎝⎜xy1⎞⎠⎟(1)c\begin{pmatrix}u\\v\\1\end{pmatrix}=H\begin{pmatrix}x\\y\\1\end{pmatrix}(1) 其中(uv1)T\begin{pmatrix}u&v&1\end{pmatrix}^原创 2017-05-10 14:32:18 · 20832 阅读 · 6 评论 -
图像单应性变换理解
什么是单应性?图像中的2D点(x,y)(x,y)可以被表示成3D向量的形式(x1,x2,x3)(x_1,x_2,x_3),其中x=x1/x3x=x_1/x_3,y=x2/x3y=x_2/x_3。它被叫做点的齐次表达,位于投影平面P2P^2上。所谓单应就是发生在投影平面P2P^2上的点和线的各种各样的映射。这种变换包括等距变换、投影变换和平面投影变换等。单应变换矩阵是一个3*3的矩阵H。这个变换可以被原创 2017-03-28 23:13:14 · 23112 阅读 · 2 评论 -
图像拼接(五):双摄像头实时视频拼接(平移模型+多线程)
在双摄像头相对平行固定,所拍摄图像视差很小,可使用平移运动模型的情形下,我们提到了“柱面投影+模板匹配+渐入渐出拼接”的解决方案。不考虑多线程,参见图像拼接(四):双摄像头实时视频拼接(平移模型) 可以看出,图像或视频拼接其实是一项”流水线”技术,包括:源图像数据获取(两幅源图像)、柱面投影、模板匹配、图像融合、输出或者是显示拼接后的图像。这个过程中每个步骤有先后,可以说是串行的,怎么能使用多线原创 2017-01-19 12:01:31 · 17486 阅读 · 4 评论 -
图像拼接(十三):OpenCV拼接多幅图像(以中间图像为参考)
在图像拼接(十三):OpenCV单应变换模型拼接多幅图像 这篇博客中实现了用单应变换模型拼接多幅图像,图像拼接使用的OpenCV库函数warpPerspective()。因为这个函数只有在右侧图像变换到左侧图像时才能完整显示,所以拼接过程选择了以最左侧图像为参考帧。由于累加误差,最右侧的图像出现严重的变形。如下所示:在这篇博客中,我们以中间幅图像为参考图像,实现多幅拼接。图像数量为4张,从左到右分别原创 2017-03-25 16:48:59 · 35542 阅读 · 11 评论 -
图像拼接(十二):OpenCV SeamFinder+GraphCut+最佳拼接缝寻找
很多情况下,使用一个全局单应变换并不能准确对齐图像,需要一些后处理来削弱拼接的痕迹,比如寻找最佳拼接缝。使用全局单应变换的对齐结果,实现代码参考图像拼接(六):OpenCV单应变换模型拼接两幅图像:仔细观察,在拼缝的下方出现了没对齐的问题。寻找最佳拼接缝算法中,Graph Cut很经典。它将计算机视觉问题和网络流联系在一起。寻找最佳拼接缝等价于求网络流的最小割。 在网络流问题中,最小割和最大流相等原创 2017-03-24 00:01:31 · 22860 阅读 · 32 评论 -
全景图(二):在Unity3D上实现360°柱面投影
在全景图(一):使用Unity完成水晶球纹理贴图 建立的工程基础之上,做修改。步骤:1、把上次创建好的水晶球移走,放到一个不妨碍观察的地方。2、创建一个圆柱体,位置设为(0,1.5,0),比例设为(2,0,5,2)。 注:比例的设置和作为纹理映射的图像的宽高比有关,Unity中默认的圆柱体是2个单位高度以及1个单位宽度。3、在圆柱体的Inspector面板中禁用Capsule Collider组件原创 2017-02-25 20:45:17 · 8897 阅读 · 2 评论 -
全景图(三):在Unity3D上实现360°球面投影
准备工作首先需要准备好一张360°视角的的照片。就像下面这样。步骤1、创建一个球体,命名为照片球(PhotoSphere)。Scale设为(10,10,10),重置位置。2、创建一个材质(Material),选中它,将其渲染器设为InwardShader。 注:这个渲染器是定制的,渲染定义文件参考全景图(二):在Unity3D上实现360°柱面投影3、禁用全局光照Directional Light原创 2017-02-26 15:17:38 · 16337 阅读 · 2 评论 -
图像拼接(六):OpenCV单应变换模型拼接两幅图像
图像拼接首要步骤就是对齐。对齐就要找到两幅图像相对的位置关系。为了描述位置之间的变换关系,研究者引人了诸如平移,仿射,单应等变换模型。每个模型无所谓好坏,各有特定的适用范围。在其次坐标系下,图像位置之间的关系,或者说同名点坐标之间关系,都可以用一个3×3的矩阵来表达。从平移到单应,这个变换矩阵的自由度逐步上升,灵活度增加,适用的场合变广,但也导致求解出来的变换矩阵不太准确和稳定,意思是容易拼飞。所以原创 2017-03-04 14:25:28 · 16636 阅读 · 8 评论 -
图像拼接(七):OpenCV单应变换模型拼接多幅图像
上篇博客图像拼接(六):OpenCV单应变换模型拼接两幅图像 实现了两幅图像的拼接,主要是使用了单应矩阵和warpPerspective()这个库函数。求取每相邻两幅图像的单应矩阵拼接多幅图像,需要计算每相邻两幅图像的单应矩阵,上篇已经封装了求取单应矩阵的类,可以拿来用。 现有4幅图像:img1img1,img2img2,img3img3,img4img4。依次从右向左排列,拼接图像以最左侧的im原创 2017-03-06 10:50:05 · 14244 阅读 · 20 评论 -
图像拼接(八):拼接多幅图像+Matlab实现+Stanford Open Course
本博客与以下文档资料一起服用效果更佳。Stanford University CS 131 Computer Vision: Foundations and Applications【OpenCV】SIFT原理与源码分析-小魏的修行路Matlab源码地址:多幅图像拼接matlab实现-优快云下载开始正文。梳理一下本篇博客图像拼接的原理:特征检测:SIFT角点检测特征描述:SIFT描述翻译 2017-03-06 16:06:58 · 44920 阅读 · 118 评论 -
图像拼接(九):双摄像头实时视频拼接(单应变换模型)
单应变换相比平移变换,具有更广泛的场景适应性,但同时稳定性会有一定程度下降。设计到的技术细节有:特征检测与描述特征匹配与单应矩阵估计opencv采集视频渐入渐出图像融合这个解决方案的硬件条件包括:有两个USB接口的计算机,两个合理放置的USB摄像头。合理放置是指:两个摄像头分割一定夹角,相机中心相距接近,所拍摄场景有足够的重叠部分。以上保证了单应变换的可用性。代码实现:#include "原创 2017-03-07 11:23:42 · 10957 阅读 · 15 评论 -
图像拼接(十):OPenCV stitching和stitching_detailed
Stitcher类与detail类OpenCV提供了高级别的函数封装在Stitcher类中,使用很方便,不用考虑太多的细节。低级别函数封装在detail命名空间中,展示了OpenCV算法实现的很多步骤和细节,使熟悉如下拼接流水线的用户,方便自己定制。可见OpenCV图像拼接模块的实现是十分精密和复杂的,拼接的结果很完善,但同时也是费时的,完全不能够实现实时应用。我在研究detail源码时,由于水平有原创 2017-03-07 16:25:47 · 26435 阅读 · 8 评论 -
图像拼接(十一):双摄像头实时拼接+stitching_detailed
OpenCV自带的stitching模块在追求拼接质量方面已经做得很好了,但是实时性不够,即使是拼接两幅图像。比如源程序拼接两幅640*480分辨率的图像,拼接时间为4.78″。对stitching_detailed.cpp源码进行改造,有利于提高实时性的举措有:调节初始化参数。比如使用GPU,这个需要重新编译OPenCV库。减少视频帧的分辨率。减少为320*240。将特征提取、匹配、变换矩阵原创 2017-03-07 17:01:09 · 19146 阅读 · 20 评论 -
OpenCV生成点集的Delaunay剖分和Voronoi图
实现内容:设置一副图像大小为600*600,图像像素值全为0,为黑色。在图像中Rect(100,100,400,400)的区域随机产生20个点,并画出。产生这些点集的Delaunay剖分和Voronoi图,并画出。程序#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>#include <iost原创 2017-03-16 23:02:01 · 2824 阅读 · 1 评论 -
《Learning OpenCV 3》Delaunay三角剖分和Voronoi图讲解
OpenCV2、OpenCV3包含三角剖分的接口,但是参考文档里并未介绍,给学习带来了麻烦。有一本经典的书《学习OpenCV》对其做了详细介绍。但苦于这本书的新版,迟迟没有翻译成中文,所以现在有关OpenCV三角剖分的资料都是关于OpenCV1的,是C语言的接口。我边学习边分享一下,自己的理解水平有限,如有错漏,谢谢指正。由于时间有限,不逐字翻译了,根据内容来。原文参考《Learning OpenC翻译 2017-03-15 23:27:00 · 9408 阅读 · 1 评论 -
OpenCV:凸包
当评价一个点集的2D空间分布时,凸包是一个有用的工具。这个点集可以是轮廓、关键点集合等。计算凸包,OpenCV提供了函数:convexHull(Mat(points), hull, true);下面的OpenCV示例程序,随机产生了一个点集,然后计算了它的凸包。并将点集和凸包画了出来。#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/h原创 2017-03-08 09:14:57 · 1280 阅读 · 0 评论 -
图像拼接(三):OpenCV同时打开两个摄像头捕获视频
使用OpenCV实现同时打开两个USB摄像头,并实时显示视频。如果未检测有两个摄像头,程序会结束并发出“摄像头未安装好”的警告。这里推荐一个小巧的摄像头视频捕捉软件:amcap,使用它可以方便的检查每个摄像头是否能正常工作。 捕获视频: 代码:#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#in原创 2017-01-18 20:13:41 · 14231 阅读 · 8 评论 -
图像任意子区域直方图快速计算
当逐像素地对像素进行邻域操作时(比如邻域求和,求邻域图像块的直方图等),运算量就会很大。这个时候可以想到用积分图像,可以这样看,积分图像是占用了前期时间,减少了后期大量重复运算。下面介绍一种快速计算图像任意子区域直方图的方法,方法实现的过程描述如下:假设最终得到的直方图箱子数(通俗点就是直方图的横坐标的单位数)为nplanes,nplanes是2的幂;输入的灰度图大小为rows*cols。首先创建一原创 2017-01-11 22:27:10 · 3422 阅读 · 1 评论 -
自适应的阈值化
对图像应用阈值创建二值图像,是提取有意义元素的好方法。但有的时候单一阈值达不到目标提取的效果。 例如,给定一幅图如下,将“富贵白头”四个字提取出来。 通过OpenCV阈值化函数cv::threshold(),纯手工选择参数,进行固定阈值二值化,发现当阈值设为80时效果最好。//采用固定阈值cv::threshold(image, binaryFixed, 80, 255, cv::THRE原创 2017-01-11 21:00:24 · 11561 阅读 · 2 评论 -
OpenCV图像检索:比较直方图
基于内容的图像检索是计算机视觉的一个重要课题。直方图是标志图像内容的一种有效方式。仅仅通过比较两幅图像的直方图测量出它们的相似度,OpenCV在cv::compareHist函数实现了这些方法。//Compares two histograms.double compareHist(InputArray H1, InputArray H2, int method)其中的method包括: me原创 2017-01-11 11:45:31 · 1581 阅读 · 0 评论 -
目标跟踪:反向投影直方图+mean shift
假设我们希望从一副(待检测)图像中检测出“飞行的蜥蜴”。首先要做的就是准备一个样本,比如在第一幅(参考)图像中选择一个包含样本的兴趣区域。 参考图像: 待检测图像:(可注意到飞蜥位置和形态都出现了轻微改变) 我们计算参考图像中兴趣区域的直方图(这里取H(色调)通道),然后将直方图归一化。这时直方图的箱子值代表的是特定颜色出现的概率。 反向投影直方图的过程包括:从归一化的直方图中读取概率值原创 2017-01-11 11:03:52 · 1988 阅读 · 1 评论 -
OpenCV图像增强:直方图拉伸和直方图均衡化
直方图反映了图像中像素值的分布情况,很多时候,图像的视觉缺陷可以根据图像的直方图来分析。比如直方图太窄,说明图像使用的灰度值范围太窄;比如直方图有一个很强烈的峰值,说明图像部分灰度值的使用频率比其他强度值要高得多。 所以,可以通过直方图信息来修改图像的灰度值。如果将一种灰度修改为另一种灰度,那么这意味着这种改变不是针对某些像素的,而是整体性的,新的颜色值只与当前像素的颜色值相关。这种关系,通常可以原创 2017-01-10 22:25:48 · 8749 阅读 · 0 评论 -
OpenCV计算和显示图像直方图
要在OpenCV中计算直方图,可调用函数calcHist(),void calcHist(const Mat* images,//源图像 int nimages,//源图像的个数。设为1,则仅为一个图像的直方图 const int* channels,//使用的通道 InputArray mask, //掩码,(可设置哪些像素不参与直方图计算) OutputArray hist, //原创 2017-01-10 21:03:36 · 7650 阅读 · 0 评论 -
OpenCV里常用的数据结构(Mat,Mask,Scalar,Range,InputArray,OutputArray等)
一、读取,显示和保存图像在这里只是进行图像读取、显示和保存,一些基本操作。需要引入两个头文件:定义了图像数据结构的核心库core.hpp和包含了所有图形接口函数的highgui头文件。#include"opencv2/core/core.hpp"#include"opencv2/highgui/highgui.hpp"#includeint main(){ //创建空图像,并读原创 2016-12-26 11:33:15 · 3402 阅读 · 0 评论 -
图像拼接(四):双摄像头实时视频拼接(平移模型)
假设两个摄像头平行固定,所拍摄的图像视差很小,可以通过“柱面投影+模板匹配+渐入渐出融合”的解决方案实现视频拼接。 关于这种方法的静态图像拼接,参考图像拼接(一):柱面投影+模板匹配+渐入渐出融合 OpenCV双摄像头捕获视频并实时显示的代码,参见:图像拼接(三):OpenCV同时打开两个摄像头捕获视频 将代码整合,实现双摄像头实时视频拼接:#include "opencv2/core/cor原创 2017-01-18 21:27:22 · 18351 阅读 · 7 评论 -
图像拼接(二):柱面投影+模板匹配+渐入渐出融合(GPU版)
本篇博客的代码修改自图像拼接(一):柱面投影+模板匹配+渐入渐出融合。新的代码充分利用了OpenCV库函数的GPU版本。在一些方法中使用了GpuMat这一数据结构,它是Mat的替代。Mat运行在CPU上,GpuMat运行在GPU上,使用这一数据结构,将一些费时的操作交由GPU处理,会提高处理速度。 文末附有完整代码清单,这里对代码做些说明: 1、使用OpenCV的GPU版本,需要重新编译Open原创 2017-01-18 16:42:11 · 8231 阅读 · 3 评论 -
图像拼接(一):柱面投影+模板匹配+渐入渐出融合
这种拼接方法的假设前提是:待拼接的两幅图像之间的变换模型是平移模型,即两幅图像同名点位置之间只相差两个未知量:Δx\Delta x 和Δy\Delta y,自由度为2,模型收得最紧。所以只有所有图像都是用同一水平线或者同一已知倾斜角的摄像机拍摄时,这种方法才适用。 整个过程为:首先对输入的两幅图像做柱面投影;然后通过模板匹配求取Δx\Delta x 和Δy\Delta y;最后采用渐入渐出的融合方原创 2017-01-18 10:46:32 · 53417 阅读 · 23 评论 -
OpenCV设置多边形二值化掩码
无论是凸多边形,还是凹多边形,已知多边形的顶点,可获取一个多边形区域填充的掩码。 使用fillPoly函数实现。void fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, intlineType=8, int shift=0, Point offset=Point原创 2017-03-19 20:16:46 · 2215 阅读 · 0 评论 -
面部变形+基于特征的图像变形+field warping-Siggraph 1992
参考资料国立台湾大学-Image Morphing-Homework图像处理(十)基于特征线的图像变形-Siggraph 1992Face Morphing on Animation Producing-ntu-csie2D Image Morphing Algorithms基于特征的图像变形算法,来源于1992年的一篇论文。它是分别在两幅图像中分别选择相应的特征对(特征线段对),然后根据原创 2017-03-13 10:31:45 · 7996 阅读 · 4 评论 -
图像接缝裁剪(seam carving)算法实现-SIGGRAPH 2007
seam carving是SIGGRAPH 2007数字图形学年会上,以色列两位教授提出的算法,用于实现“内容保留”的图像伸缩。 出自论文《Seam Carving for Content-Aware Image Resizing》,作者的个人主页有对该算法的描述。常规的图像伸缩基于采样和插值,图像内容会产生拉伸或压缩,比如图像中有人脸等内容,通常产生糟糕的效果。seam carving的基本原创 2016-12-19 19:21:03 · 15171 阅读 · 4 评论 -
特征检测:白话Harris角点检测
角点是一个可重复、可靠、显著的特征。在特征匹配用来检测特征点的位置。本篇博客,用大白话谈一谈自己对Harris角点检测算法的理解。Harris实际上是设计了一个准则来度量角点的特点。角点有啥特点呢?显著的特点就是:在角点的邻域,图像邻域有两个以上的主方向,即邻域方向导数的和有多个极值。直观感受下图,下面这个式子还不是度量角点的准则,它是描述邻域梯度和的:E(u,v)=∑x,yw(x,y)[I(x+u原创 2017-02-28 13:25:02 · 1546 阅读 · 0 评论 -
OpenCV角点检测器测试和比较
关于特征检测,OpenCV提供了通用的接口FeatureDetector类。简单调用其成员函数create()和detect()即可完成角点检测。选取8个以角点为特征的特征检测器进行测试,包括:HARRISGFTT (Shi-tomasi)SIFTSURFFASTSTARORB (oriented BRIEF)BRISK测试代码#include <stdio.h>#includ原创 2017-02-28 21:35:26 · 2619 阅读 · 2 评论 -
OpenCV对像素的操作
一、访问像素值利用Mat的at函数可以访问元素。因为Mat可以接受任何类型的元素,所以at函数被实现成一个模板函数,在调用时必须指定图像元素的类型:image.at<uchar>(j,i)=0;//或,对于彩色图像image.at<cv::Vec3b>(j,i)[channel]=0;channel索引用来指明三个通道的一个。因为彩色图像有3个通道,所以访问彩色图像的像素会返回一个向量。Open原创 2016-12-27 18:07:39 · 6425 阅读 · 1 评论