代码改变世界

随笔分类 -  opencv

立体视觉算法-SGBM(一)

2013-01-21 16:16 by libing64, 7855 阅读, 收藏,
摘要: 最近一直在学习SGBM算法,作为一种全局匹配算法,立体匹配的效果明显好于局部匹配算法,但是同时复杂度上也要远远大于局部匹配算法。算法主要是参考StereoProcessingbySemiglobalMatchingandMutualInformation,里面有讲完整的算法实现。OpenCV中实际上是提供了SGBM类进行SGBM算法的实现。#include<highgui.h>#include<cv.h>#include<cxcore.h>#include<iostream>usingnamespacestd;usingnamespacecv;i 阅读全文

图像处理基本算法--仿射变换

2012-01-04 23:26 by libing64, 2760 阅读, 收藏,
摘要: 几何空间变换和图像配准几何空间变换又称为橡皮膜变换,因为他可以看做是在一幅橡皮膜上印制图像,然后根据一定规则拉伸橡皮膜。由两个基本操作组成:1)坐标的空间变换2)灰度内插最常用的是仿射变换一般形式如下:[x,y,1] = [v,w,1]*T [t11 t12 0] = [v,w,1]*[t21 t220] [t31 t32 0]这一变换可以根据矩阵T中元素的值,对一组坐标点做尺度变换,旋转,平移,偏移。我们有两种方法使用该式子,第一种是前向映射,它由扫描输入图像的像素,并在每一个位置(v,w)直接计算输出图像中像素的空间位置(x,y)... 阅读全文

图像处理基本算法

2011-12-12 22:17 by libing64, 730 阅读, 收藏,
摘要: 使用openCV进行图像处理,总感觉并不能真正的理解图像处理的核心内容,因此我感觉对图像处理的理解才是关键。基本的反色操作,主要是了解OpenCV对图像数据的操作方式:指针如下:unsigned char * ptr;//定义指针for(int i = 0 ;i < img->height;i++){ptr= (unsigned char*)img->imageData+ i*img->widthStep;//根据偏移获取数据for(int j = 0 ; j< img->width; j++){*(ptr+3*j) -= 20;*(ptr + 3* j+1 阅读全文

opencv新手注意

2011-11-29 21:00 by libing64, 382 阅读, 收藏,
摘要: 注意事项1 看如下代码:CvScalar s = cvScalar(20.0);由于opencv不是真正的类,因此构造函数和类名不一致,构造函数的首字母是小写的!!!!!opencv乃是用C写的,因此尽管含有类的思想,但是不是类,而是结构,不是构造函数,而是内联函数。注意字母的大小写~2 如果仅是采用opencv而使用C语言编写程序,注意变量的定义在C语言中只能在每一个函数的开头,不能像C++一样在函数的任何位置都可以定义变量~3 既然C++是基本完全兼容C的,而C++类的特性又十分适合编写大型的程序,完全可以用C++来编写程序,只需新建文件的时候文件后缀名改为.CPP即可。4 在受用open 阅读全文

sift实现的双目测距

2011-11-13 21:30 by libing64, 4843 阅读, 收藏,
摘要: 最近一直在做双目测距的工作,今天终于获得一定的成果~拿出来与大家分享~一、源码下载:http://download.csdn.net/detail/renshengrumenglibing/3791149二、硬件:三、匹配效果:四、基本算法 参见学习opencv中关于双目测距的算法最关键的Z = fx*T/(x2 - x1)五、基本参数:摄像头间距:T = 187mm由于在实际测量过程中,发现摄像机的焦距并非固定不变的,在标定的时候会发现,随着距离的变大,测量的焦距逐渐变大,于是采用测量多组的的数据拟合 出摄像头的焦距公式求取焦距与实际距离的拟合公式:fx = g(distance)实际距离 阅读全文

opencv图像处理9-图像金字塔

2011-11-06 10:57 by libing64, 827 阅读, 收藏,
摘要: 图像金字塔在分割和匹配方面有重要用途,其中在sift匹配中是重要的一环~~先看效果:PyrDown图像的下采样void cvPyrDown( const CvArr* src, CvArr* dst, int filter=CV_GAUSSIAN_5x5 );src输入图像.dst输出图像, 宽度和高度应是输入图像的一半 ,传入前必须已经完成初始化filter卷积滤波器的类型,目前仅支持 CV_GAUSSIAN_5x5函数 cvPyrDown 使用 Gaussian 金字塔分解对输入图像向下采样。首先它对输入图像用指定滤波器进行卷积,然后通过拒绝偶数的行与列来下采样图像。PyrUp图像的上采样 阅读全文

opencv图像处理8-卷积

2011-11-06 10:46 by libing64, 1614 阅读, 收藏,
摘要: 卷积是本章所讨论的很多转换的基础。先看看效果:抽象的说,这个术语意味着我们对图像的每一个部分所做的操作。从这个意义上讲,我们在第五章所看到的许多操作可以被理解成普通卷积的特殊情况。一个特殊的卷积所实现的功能是由所用的卷积核的形式决定的。这个核本质上是一个大小固定,由数值参数构成的数组,数组的标定点通常位于数组的中心。数组的大小被称为核支撑。单就技术而言,核支撑实际上仅仅由核数组的非零部分组成。图6-1描述了以数组中心为定标点的3×3卷积核。若要计算一个特定点的卷积值,首先将核的标定点定位到图像的第一个像素点,核的其余元素覆盖图像中其相对应的局部像素点。对于每一个核点,我们可以得到这个 阅读全文

opencv图像处理7-打开大图

2011-11-05 23:33 by libing64, 709 阅读, 收藏,
摘要: 显示大图片,当图片较大时,可以通过鼠标拖动图片上下移动先看效果:由于opencv没有滑动条,无法像VC或者java那样直接滑动浏览,但是在图片上直接拖动也是一样的。拖动时通过捕获鼠标事件,记下按下和抬起的点,CvPoint first = cvPoint(0,0);CvPoint last = cvPoint(0,0);void on_mouse(int event ,int x, int y,int flags, void*param){switch(event){case CV_EVENT_LBUTTONDOWN:{first.x = x;first.y = y;}case CV_EVEN 阅读全文

图像处理--多个平台下双目视觉的实现

2011-11-05 17:46 by libing64, 2646 阅读, 收藏,
摘要: VC6.0下的实现双目视觉见另一篇博客:http://blog.csdn.net/renshengrumenglibing/article/details/6884124这里主要讲解在opencv2.3+VS10下的实现,opencv2.1+VS10跟这个类似,但是需要逆序打开摄像头。先看效果:打开三个摄像头:两个USB摄像头一个联想自带的摄像头双目视觉实现总结:一、VC6.0+opencv1.0实现双目视觉时,采用的是使用了directshow的一个类CameraDShttp://blog.csdn.net/renshengrumenglibing/article/details/68841 阅读全文

图像处理-sift算法

2011-11-02 19:01 by libing64, 2356 阅读, 收藏,
摘要: sift是图像匹配的非常经典的算法,但是很复杂,要想自己拿C或C++实现很麻烦,如果只是使用的话,有国外某高人维护的sift库,前期只要自己能够调用即可,关键是要熟悉大致的流程,对sift库有个了解,具体的工作只要调用其中的函数即可。匹配效果:sift是图像匹配的非常经典的算法,但是很复杂,要想自己拿C或C++实现很麻烦,如果只是使用的话,有国外某高人维护的sift库,前期只要自己能够调用即可,关键是要熟悉大致的流程,对sift库有个了解,具体的工作只要调用其中的函数即可。一、sift简介1、sift算法应用典型场合: 物体识别 机器人定位与导航 图像拼接 三维建模 手势识别 视频跟踪 笔记鉴 阅读全文

图像处理3--摄像头标定

2011-10-22 08:29 by libing64, 2989 阅读, 收藏,
摘要: 这几天在做摄像机标定,主要参考了opencv的例程,但是上面还是有一些Bug的,另外摄像头读取的方式改用的directshow的CameraDS类。一、摄像机标定基本步骤道具的准备:有photoshop、画图之类的公工具自制棋盘,采用A3或A4打印出来,贴到电脑旁的某个位置。1 新建一个模拟棋盘,标明横向和竖向的角点个数我绘制的棋盘角点6*72 初始化参数,4个内参数,以及畸变参数3 打开摄像头,获取一帧图像这里采用Directshow的读取方式,便于向双目的转换。4 寻找角点并绘出,当找出全部角点(6*7)时,认为该图片有效,存储图片5每找出一张图片就进行一次标定,更新参数6对3、4、5循环 阅读全文

图像处理2--打开多个摄像头

2011-10-18 13:05 by libing64, 427 阅读, 收藏,
摘要: 使用双目视觉这里用到了opencv和directshow两个方面的内容,本次没有用到MFC。需要对编译器进行设置(opencv在图像处理方面很强大,但是在图像采集方面似乎只能采集一个摄像头,因此这里借用directshow进行双目图像的获取,之后就可以利用opencv进行处理)首先新建一个console应用程序,空工程,添加一个main.cpp一、与directshow有关的设置首先要去下载两个类CameraDS.h CameraDS.cpp,并要拷贝目录DirectShow,因为采集图像时会用到其中的函数。下载话在CSDN上找一个双目视觉的工程,里面一般都有。//////////////// 阅读全文

图像处理1--VC6.0下directshow配置

2011-10-08 13:51 by libing64, 290 阅读, 收藏,
摘要: 注:网上转载,测试通过DirectShow开发环境配置及测试例程 开发环境SDK:DirectX9.0b (Summer 2003)Visual C++ 6.0参考文档:SDK文档1) DirectShow->Getting Started->Setting Up the Build Environment2) DirectShow->DirectShow Reference->DirectShow Base Classes->Using the DirectShow Base Classes3) DirectShow->Getting Started-&g 阅读全文

opencv图像处理6--网球检测

2011-09-27 22:49 by libing64, 916 阅读, 收藏,
摘要: void CBallsampleDlg::OnOK(){// TODO: Add extra validation here//CDialog::OnOK();IplImage*frame = NULL; //定义帧,每帧就是一张图 IplImage* B_part = NULL;IplImage* G_part = NULL;IplImage* R_part = NULL;//三个通道下的灰度图IplImage* biImage = NULL;//调试用,G通道二值化后的灰度图IplImage* biImage_B = NULL;//B通道下进行阈值分割后的图片。IplImage* dst 阅读全文

opencv图像处理5--车辆检测

2011-09-25 13:49 by libing64, 2051 阅读, 收藏,
摘要: void CTrafficsampleDlg::OnOK() //读入视频并检测车辆{// TODO: Add extra validation here//此处添加图像处理的代码//CDialog::OnOK();IplImage *frame = NULL; //定义帧,每帧就是一张图 IplImage *B_part = NULL, *G_part = NULL, *R_part = NULL;IplImage *pFrImg = NULL; //前景图片IplImage *pBkImg = NULL; //背景图片IplImage *dst = NULL;CvMemStorage* s 阅读全文

[置顶][置顶]opencv图像处理4--opencv下鼠标事件

2011-09-21 21:45 by libing64, 613 阅读, 收藏,
摘要: #include<highgui.h>#include<cv.h>#include<stdio.h>//#include<iostream>//鼠标事件CvPoint down;CvPoint up;CvRect rect;IplImage *dst;void on_mouse(int event,int x,int y,int flags,void *param){//鼠标事件分为两个部分,左键按下和左键弹起 IplImage *image=(IplImage *)param; if (event == CV_EVENT_LBUTTONDOWN 阅读全文

[置顶]opencv图像处理3--opencv下使用滑动条

2011-09-21 21:12 by libing64, 286 阅读, 收藏,
摘要: #include "cv.h"#include "highgui.h"#include <stdio.h>#include <ctype.h>void on_trackbar(int position){if( position == 0 ) {printf("the position is%d", position);} else {printf("the position is %d", position); }}int main(){IplImage* pImg; //声明IplIma 阅读全文

opencv图像处理2--打开图片并显示

2011-09-20 00:08 by libing64, 675 阅读, 收藏,
摘要: //在opencv下图像的打开及显示极为简单,仅需调用几个小函数即可~~//需要注意的一点是opencv虽然含有类的思想,但确实是用C语言完成,C下没有类一说,因此那些构造函数其实是C下的内联函数,或者宏,仔细观察的话,就会发现,他的构造//函数和类名的首字母不一样,一个小写,一个大写。若把它当类来使,这点是极容易错的~//首先要配置opencv的环境,网上很多~这里就不赘述了//1建立MFC的单文档程序SDI //2在sampledoc.h中添加#include<highgui.h> //3在sampledoc.h中public下添加 public: IplImage* img; 阅读全文

opencv图像处理1--IPlImage结构分析

2011-09-17 08:20 by libing64, 683 阅读, 收藏,
摘要: IplImage结构由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理。IplImage结构具体定义如下:typedef struct _IplImage{int nSize;/* IplImage大小*/int ID;/*版本(=0)*/int nChannels;/*大多数OPENCV函数支持1,2,3或4个通道*/int alphaChannel; /*被OpenCV忽略*/int d 阅读全文

VC6.0图形处理5--几何变换

2011-08-31 23:38 by libing64, 283 阅读, 收藏,
摘要: 源码下载:http://download.csdn.net/detail/renshengrumenglibing/3875522//注意如何申请新的存储空间,存放处理后的图片,并利用memcpy,将数据copy给原来存储图像的结构void CBMPViewerDoc::OnMenuitem32788() //缩小变换{// TODO: Add your command handler code hereint linewidth;linewidth=(pbi->bmiHeader.biWidth*pbi->bmiHeader.biBitCount+31)/32*4;int i0 阅读全文