
探讨OpenCV
文章平均质量分 80
通过对OpenCV中众多的图像处理、视觉、机器学习等算法学习与实践和源代码解析。领略其图像分析中常用的技术,并了解如何使用C/C++高效实现。
松子茶
关注数字图像处理,数据隐藏与信息隐藏,计算机视觉和机器学习...(欢迎关注微信公众号ID:songzitea)
展开
-
椭圆轮廓识别
首先,从图像中检测出轮廓,然后再从轮廓中检索出椭圆轮廓。关于Image Engineering& Computer Vision更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2014-06-01 19:50:02 · 4627 阅读 · 1 评论 -
图像肤色初步检测实现
肤色检测输出结果中有许多瑕疵,待于进一步处理(如:滤波操作.....)。在此贴出几种图像肤色检测相关代码,供大家参考。原创 2014-05-02 09:03:22 · 3428 阅读 · 2 评论 -
基于直方图的图像二值化算法实现
图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。在过去年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果。在分类方法中,基于直方图的二值算法都从不同的科学层次提出了各自的实施方案,并且这类方法都有着一些共同的特点:简单、算法容易实现和执行速度快。原创 2014-05-01 21:15:44 · 4600 阅读 · 0 评论 -
图像的形态学处理
数学形态运算中,最常见的基本运算有七种, 分别为:腐蚀、膨胀、开运算、闭运算、击中、细化和粗化, 它们是全部形态学的基础。腐蚀和膨胀,看上去好像是一对互逆的操作,实际上,这两种操作不具有互逆的关系。 开运算和闭运算正是依据腐蚀和膨胀的不可逆性,演变而来的。 先腐蚀后膨胀的过程就称为开运算。 闭运算是通过对腐蚀和膨胀的另一种不同次序的执行而得到的, 闭运算是先膨胀后腐蚀的过程,其功能是用来填充物体内细小空洞、连接邻近物体、平滑其边界, 同时不明显改变不明显改变其面积。原创 2014-04-26 22:13:02 · 2392 阅读 · 0 评论 -
读取文件夹连续图片
总结一下关于图片批量处理方法,仅作参考。原创 2014-04-24 13:12:40 · 3289 阅读 · 0 评论 -
实现图像pyramids
''' file name : pyramids.pyDescription : This sample shows how to downsample and upsample images'''import cv2import numpy as npimg = cv2.imread('test.jpg')print " Zoom In-Out demo "print " Pre原创 2014-04-08 20:51:03 · 1947 阅读 · 0 评论 -
模拟Matlab显示图像的效果
VisualTool.h头文件,VisualTool.cpp...关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博和新浪微博songzi_tea.原创 2014-04-06 18:15:05 · 2617 阅读 · 0 评论 -
IplImage与BMP相互转换
在windows编程中,很多图片信息,都是基于windows系统所谓的DIB(设备无关位图)的结构,其定义在结构体 BITMAPINFOHEADER 中。本方法可以讲 windows 定义的DIB 结构和Opencv内部定义的IPLImage结构做相互转化。原创 2014-04-06 14:13:04 · 2148 阅读 · 0 评论 -
利用OpenCV鼠标控制窗口大小
功能程序:使用鼠标控制三个窗口的放大与缩小。在此不附上运行结果效果图,若需体验其效果如何,可以自己动手copy参考代码,运行试试一下看。原创 2014-04-06 09:17:48 · 3441 阅读 · 0 评论 -
实现图像的矩形与轮廓
实现图像中最小面积的矩形,适合椭圆形的轮廓。参考代码如下所示:import cv2import numpy as npdef thresh_callback(thresh): global contours edges = cv2.Canny(blur,thresh,thresh*2) drawing = np.zeros(img.shape,np.uint8原创 2014-02-01 10:15:22 · 3449 阅读 · 0 评论 -
用于测量OpenCV的API
利用python实现用于测量Opencv的API的参考代码如下所示:from glob import globimport cv2import reif __name__ == '__main__': cv2_callable = set(['cv2.'+name for name in dir(cv2) if callable( getattr(cv2, name) )])原创 2014-02-01 09:47:03 · 2270 阅读 · 0 评论 -
简单地实现图像坐标的信息
实现图像坐标的信息,比较简单,如下参考代码所示:from PIL import Imagefrom pylab import *im = array(Image.open('test.jpg'))imshow(im)print 'Please click 3 points'x =ginput(3)print 'you clicked:',xshow()原创 2014-02-01 09:56:17 · 2026 阅读 · 0 评论 -
积分投影
将图像序列中的每一帧图像分别沿水平和垂直方向进行积分投影形成两个积分投影向量。即:对于二值化后的图像,进行水平和垂直两个方向的投影,然后分别建立直方图,可以进一步进行阴影去除。关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2014-01-07 19:44:58 · 5562 阅读 · 0 评论 -
实现自动识别OpenCV的版本号
当每次下载OpenCV的新版本时,都需要重新写头文件,更改链接库配置,有点麻烦。所以,我们可以利用OpenCV的版本信息定义了一个宏,无论Opencv是220还是246都能够支持(本人测试过OpenCV2.2.0和OpenCV2.4.6),这样,可以再不用担心更新版本带来的问题了.在此帖出头文件的代码,与大家分享。关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2014-01-07 17:25:07 · 5404 阅读 · 4 评论 -
利用OpenCV实现图像纹理特征提取
这个程序是简单地图像纹理特征提取,参考代码如下所示:IplImage * cvSampleImageTextureExtraction(IplImage* img,IplImage* dst){ uchar* data=(uchar*)img->imageData; int step=img->widthStep; //IplImage* dst=cvCreateImage(cvSize原创 2013-12-31 15:19:58 · 29810 阅读 · 11 评论 -
利用OpenCV实现图像边缘直方图输出
这是边缘直方图显示程序,今天整理了以前编写的程序,贴出来给大家分享一下(注意以前,这个编写程序有点乱,请原解(^_^)~.).参考代码如下所示:#include "opencv2/opencv.hpp"#pragma comment(lib, "opencv_core246d.lib")#pragma comment(lib, "opencv_imgproc246d.lib")原创 2013-12-31 14:20:45 · 4649 阅读 · 0 评论 -
实现灰度图像峰值信噪比计算
峰值信噪比(PSNR),一种评价图像的客观标准。它具有局限性,PSNR是“PeakSignaltoNoiseRatio”的缩写。peak的中文意思是顶点。而radio的意思是比率或比列的。整个意思就是到达噪音比率的顶点信号,psnr是一般是用于最大值信号和背景噪音之间的一个工程项目。通常在经过影像压缩之后,输出的影像通常都会有某种程度与原始影像不一样。为了衡量经过处理后的影像品质,我们通常会参考PSNR值来认定某个处理程序够不够令人满意。原创 2013-12-26 14:10:45 · 11464 阅读 · 1 评论 -
利用OpenCV实现模拟绳线运动
模拟绳线的运动,某一时刻的效果如下:void DrawString(IplImage *image, double t){ if(!image) return; cvSet(image, cvScalarAll(250)); int sampleCount = image->width/2; int marginalX = (im原创 2013-12-23 19:01:13 · 2188 阅读 · 0 评论 -
视频流读取与视频帧处理
视频信号是视觉信息的一个主要源头,它由按序列排放的图像组成,即帧(Frame)。为了处理视频序列,需要读取每一Frame.用c++类封装VideoProcessor类视频读取处理的代码。处理视频帧主要是对于每个视频帧都应用一些处理函数。将自己的类中封装OpenCV的视频获取框架,同时可以指定每帧调用函数。作为一个视频帧处理函数,如:canny函数计算输入图像的Canny边缘。接着,定义一个video处理类,将与一个回调函数相关联。使用此类,将创建一个实例并指定输入的video文件,绑定回调函数,然后开始处理原创 2013-12-20 21:00:53 · 10642 阅读 · 0 评论 -
利用函数参数实现图像混合
函数 cvAddWeighted 计算两数组的加权值的和: dst(I)=src1(I)*alpha+src2(I)*beta+gamma 所有的数组必须有相同的类型相同的大小或ROI大小.在cvAddWeighted()中,有两个源图象src1 和 src2。这两个图象可以是任何象素类型,只要它们的类型相同。它们可以是单通道或是三通道,只要它们相符。运算结果的目标图象,dst必须和src1和src2有相同的象素类型。这些图象可以是不同的尺寸,但它们的ROI必须有相同的大小,否则OpenCV会报告一个错原创 2013-07-06 15:49:59 · 2741 阅读 · 0 评论 -
获取图像感兴趣地矩形区域实现
虽然在开发APP中,鼠标操作开发非常简单,它也属于用户接口设计,一直使用Misscoft Studio 中C/C++或.net来做,但是如果只需要简单的鼠标,键盘操作。而OpenCV并未直接提供库的函数进行鼠标操作。本节介绍使用OpenCV完成鼠标操作相关知识。鼠标操作主要理论有两点,第一是监控鼠标操作,鼠标点击,移动,松开,然后通过mouse_event识别判断出那一种鼠标的操作,根据不同的操作然后进行处理;第二是在主函数中加入鼠标的回调函数,将鼠标操作与程序的窗口绑定。每当滑动鼠标在窗口点击一下的时候,原创 2013-11-26 18:43:08 · 7659 阅读 · 0 评论 -
实现图像特效之浮雕与雕刻
图像处理软件中,如PhotoShop,免费开源的位图形编辑GIMP软件中,对图像进行特效的浮雕或雕刻功能。本节介绍使用OpenCV实现图像特效之浮雕和雕刻相关知识,并贴出相关参考代码和输出测试图像效果图。浮雕/雕刻算法实质是很简单地,即:对图像的每一个点进行卷积处理。假设原图像为X,处理后的图像为Y;浮雕算法核kernel矩阵定义为:[1 , 0, 0 ; 0, 0, 0; 0, 0,-1]. 那么,对于坐标为(i,j)点,浮雕效果图的算法为Y(i,j)=X(i+1,j+1)-X(i-1,j-1)+128原创 2013-11-21 22:45:17 · 6103 阅读 · 0 评论 -
图像亮度变换
图像处理中,亮度变换指图像在空域上的点运算,通常包括图像增强,亮度/对比度调节,GAMMA值调节各直方图调整等。如何进行图像GAMMA值调节,我们可以参考Matlab中函数imadjust.m理解其原理,然后,使用OpenCV实现与函数imadjust一样功能,进行图像亮度变换实现。亮度变换的原理可以参考Matlab中函数imadjust.m.首先,在imadjust中,参数gamma指明了由f 映射生成图像g 时曲线的形状。如果gamma的值小于1,映射被加权至较高(较亮)的输出值。如果gamma的值大于原创 2013-11-19 21:03:00 · 7409 阅读 · 0 评论 -
二维图像滤波实现
函数cvFilter2D对图像做卷积运算。参数src : 输入图像 dst : 输出图像 kernel : 卷积核,单通道浮点矩阵。如果想将不同的核应用于不同的通道,则先用函数cvSplit将图像分解到单个色彩通道上,然后再单独处理。anchor : 核的锚点,表示一个被滤波的点在核内的位置。锚点应处于核内部。默认置为(-1,-1)表示锚点在核中心。函数cvFilter2D对图像进行线性滤波,支持替换方式操作。当核运算部分超出输入图像时,边界外面的像素值等于离它最近的图像像素值。原创 2013-11-17 15:16:39 · 5258 阅读 · 0 评论 -
图像的Log-Polar极坐标变换
在opencv中,函数cvLogPolar功能是将图像映射到极坐标。 src 源图像dst 目标图像center 变换中心,此处输出精度最高。 M 幅度尺度参数flags:为插值方法标示与下面选项的组合:CV_WARP_FILL_OUTLIERS 填充目标图像中的所有像素,如果某些像素对应于源图像之我的位置,则用0填充.CV_WARP_INVERSE_MAP 表示矩阵是从目标图像到源图像的反变换,因此,可以直接用于像素插值;否则,函数从map_matrix寻找变换。说明函数cvLogPolar使用如原创 2013-11-17 13:45:25 · 15101 阅读 · 1 评论 -
图像旋转与缩放实现
通过cvGetQuadrangleSubPix函数理解来图像的旋转与缩放实现。函数cvGetQuadrangleSubPix提取像素四边形,并使用子像素精度。函数参数:src:输入图像。dst: 提取的四边形。map_matrix: 2X3变换矩阵。函数cvGetQuadrangleSubPix提取像素四边形,并使用子像素精度从图像src中提取四边形,并将结果存储于dst,计算公式是:dst[x + width(dst)/2, y + height(dst)/2] = src[x*A11 + y*A12原创 2013-11-14 23:38:05 · 3530 阅读 · 1 评论 -
图像分配和释放与访问图像元素
分配和释放图像对图像分配和释放操作可以通过以下几种方式实现。size可使用函数cvSize(width,height);depth 为像素深度用比特表示。channels 为每个像素值的通道数,可以是1,2,3或4.通道是交叉排列的,一幅彩色图通常的排列顺序是B0G0R0B1G1R1B2G2R2.........访问图像元素。假设要访问图像第k通道,第i行、第j列的像素值,那么可采用的方式如下所示:1.间接方式这是一种常用的方式,可以访问任何类型的图像,但是效率不高。直接方式,直接访问效率高,但容易出错。用原创 2013-11-13 11:14:38 · 2269 阅读 · 0 评论 -
矩阵的使用与操作
矩阵和图像的使用与操作是掌握OpenCV(C语言版)的基本功能。本节主要介绍OpenCV中C语言版(OpenCV2.0以下)的矩阵使用方法。OpenCV有一个矩阵操作的C语言接口,另外也有一些C++语言的矩阵操作接口,通常C++语言接口更方便,且同样有效。在OpenCV中,向量被当成是行或列为1的矩阵,并且矩阵在内存中的存储方式是按行存储,且每行按4字节对齐。对矩阵和向量的操作分为几种类型.即:矩阵与矩阵之间的操作,矩阵元素之间的操作,向量乘法操作,单个矩阵操作,非齐次线性系统的求解操作,对称矩阵操作和奇齐原创 2013-11-12 14:18:36 · 3260 阅读 · 0 评论 -
OpenCV模块解析与构架图
本节主要介绍OpenCV中C语言版(OpenCV2.0以下)和C++语言版各模块功能,以及构架图。在windows下较低版本(2.0以下)的OpenCV中包含此模块,一般用于处理和操作摄像头和视频流的跨平台模块,在windows下 被封装成.dll动态链接库,在Linux中被以so(共享库,和动态链接库类似)的形式使用。 opencv_core模块,其中包括库中核心函数结构,特别是基础的数据结构和算术函数。opencv_imgproc模块,包含图像处理函数。opencv_highgui模块,包含读写图原创 2013-11-11 21:20:34 · 5268 阅读 · 0 评论 -
Corner Detection Using cvGoodFeaturesToTrack
Here’s an example opencv application which uses cvGoodFeaturesToTrack to detect corners in a webcam video feed.// This code displays corners found by the opencv function// GoodFeaturesToTrack (cvGo原创 2010-07-05 17:44:00 · 4618 阅读 · 0 评论 -
OpenCV编写毛玻璃效果实现(需进一步提高)
IplImage* src = cvLoadImage("../Test.jpg", 1); if(src) { int w = src->width, h = src->height, ws = src->widthStep;uchar* dsrc = (uchar*)src->imageData; IplImage* dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels); uchar* ddst = (uchar*)dst-原创 2010-06-04 20:17:00 · 2746 阅读 · 0 评论 -
OpenCV对图像获取像素值方法总结
常规方法获取像素值: cv::Mat cvImg = imread("E:\\Test,jpg"); for(int i = 0;i < cvImg.rows; i++){ for(int j = 0;j < img.cols;j++){ s = cvGet2D(img,i,j); // get the (i,j) pixel value s原创 2012-12-11 13:40:46 · 3870 阅读 · 0 评论 -
OpenCV获取与设置像素点的值的几个方法
使用 Mat 中对矩阵元素的地址定位的知识。使用 Mat::at 函数原型 template<typename _Tp> inline _Tp& Mat::at(…) //其中参数有多个,也就是说 at 函数有多个重载。返回值为 Mat 类型, Mat 有个索引的重载,也就是 [] 符号的重载,用这个重载可以定位多通道数据,具体示例可以看下面代码。注意 Mat::at 函数是个模板函数, 需要指明参数类型, 因为这张图是具有红蓝绿三通道的图,所以它的参数类型可以传递一个 Vec3b, 这是一个存放 3 个原创 2012-12-30 20:05:53 · 7460 阅读 · 0 评论 -
创建Mat 对象
读取、修改、保存图像 已经讲解了如何使用函数 imwrite() 将一个矩阵写入图像文件中。但是为了debug,更加方便的方式是看实际值。为此,你可以通过 Mat 的运算符 Mat 不但是一个很赞的图像容器类,它同时也是一个通用的矩阵类,所以可以用来创建和操作多维矩阵。创建一个Mat对象有多种方法:矩阵。创建一个Mat对象有多种方法:Mat() 构造函数对于二维多通道图像,首先要定义其尺寸,即行数和列数。然后,需要指定存储元素的数据类型以及每个矩阵点的通道数。为此,依据下面的规则有多种定义比如 CV_8UC原创 2013-03-01 13:31:15 · 7270 阅读 · 0 评论 -
lplImage格式与Mat格式之间转换
Mat的拷贝只是复制了Mat的信息头,数据的指针也指向了被拷贝的数据地址,而没有真正新建一块内存来存放新的矩阵内容。这样带来的一个问题就是对其中一个Mat的数据操作就会对其他指向同一块数据的Mat产生灾难性的影响。传统的lplImage格式也可直接转换为Mat格式。如果想将新版本的Mat格式转换为老版本,则需要如下调用。Mat结构更加友好,很多操作更接近MATLAB的风格5.也有Point2f,Point3f,vector等数据结构可以使用.原创 2013-01-07 14:36:29 · 6526 阅读 · 0 评论 -
flipcode进行图像简单反转实现
flip函数Flips a 2D array around vertical, horizontal, or both axes.C++: void flip(InputArraysrc, OutputArraydst, int flipCode)C: void cvFlip(const CvArr*src, CvArr*dst=NULL, intflip_mode=0)Parameters: src - input array dst - output array of the same size a原创 2013-01-08 14:07:15 · 21784 阅读 · 0 评论 -
OpenCV中的结构体、类与EmguCV的对应表
Basic Structures main data structures used in opencv.Dynamic Structuresfor creating growable sequences and other dynamic data structures allocated in CvMemStorage. If you use the new C++, Python, Java etc interface, you will unlikely need this functionalit原创 2013-01-02 22:29:46 · 13468 阅读 · 0 评论 -
OpenCV2.4.6 与VS2008,Python2.7.5配置和图像载入显示
自从OpenCV2.2开始,OpenCV 库便分成几个模块并位于lib文件中,本节介绍从OpenCV2.4.6与VS2008 、Python2.7.5如何配置环境,如何外部文件载 入图像、在窗口中显示图像。自从OpenCV2.2开始,OpenCV 库便分成几个模块并位于lib文件中,本节介绍从OpenCV2.4.6与VS2008 、Python2.7.5如何配置环境,如何外部文件载 入图像、在窗口中显示图像。配置环境Installing OpenCV2.4.6 for Visual Studio 2008.原创 2013-07-20 15:44:00 · 6843 阅读 · 0 评论 -
图像像素操作
本节主要探讨是:访问像素值、使用指针和迭代器遍历图像以及遍历图像和邻域操作。访问像素值为了访问 代码中指定元素所在的行和列。程序会返回相应的元素。如果是单通道的图像,返回值是单个数值;如查多通道的图像,返回值则是一组向量。实现方法我们创建一个椒盐现象的函数,第一个参数是一张输入图像,第二个参数是我们欲将其替换成白色像素点的像素点个数。我们在大多数的图像处理中,为了计算,需要遍历图像的所有像素。考虑到将要访问的像素个数非常之多,高效地遍历图像时非常重要的。本例中提供的中是颜色缩减函数的一种实现方式,不必局限于原创 2013-07-20 22:31:50 · 4788 阅读 · 1 评论 -
直方图计算
在图像像素操作一节中,介绍了如何访问像素值、使用指针和迭代器遍历图像以及遍历图像和邻域操作。接下来,我们介绍如何用(C语言版和C++语言版的)OpenCV来计算一维直方图计算,然后,给合python开发工具和NumPy计算和绘制直方图。在数字图像处理中,灰度直方图是一种最简单、最有用的工具之一,它概括了一幅图像的灰度级内容。一个图像是由不同颜色值的像值组成。像素值在图像中的分布情况是这幅图像的一个重要特征。OpenCV里面提供了不少有关直方图处理的函数。其中最基本的是计算直方图的函数calcHist( )。原创 2013-08-02 18:53:18 · 8705 阅读 · 0 评论