之前日记



cxcore200d.lib cv200d.lib highgui200d.lib
cxcore200.lib cv200.lib highgui200.lib 
opencv 学习笔记
之前
主要是看代码为主,了解opencv为主,参考资料为opencv.org.cn和那本opencv中文圣经电子版。
加上对C VC++6.0都不太了解,进展不大。
在读取图片(cvLoadImage函数)的时候遇到一些问题,后来知道是,写绝对地址的时候,需要双斜杠,例如
cvLoadImage("F:\\opencv-test\\img\\Debug\\Image.jpg",0 );


7.19
canny边缘检测函数
今天试用canny边缘函数,开始遇到一点问题,debug显示函数格式不匹配。
后来解决了。遇到问题的原因是canny只能识别二值图像,对于彩色,灰度图像就会出现此问题。(但是我觉得canny应该是输入灰度,输出二值吧)
而实际上,二值图像不已经有明显的边界了吗?还不清楚该函数的3个参数是什么意思待解
贴上
传统的canny算法的主要步骤:
1、使用sobel差分算子求出灰度图像的x和y方向导数;
2、求出图像各点梯度大小及其方向;
3、设置高低两个阈值,梯度大于高阈值为强边像素点,大于低阈值为潜在可能是较弱的边缘点;
4、在经过一次筛选剩下的强边缘点中沿着梯度方向进行非极大值抑制;
5、顺着二次筛选后的强边点寻找邻近的弱边点得到最终的边缘。


7.22
摄像头
今天 为了摄像头无法正常使用具体问题描述如下
我的电脑是带摄像头的笔记本电脑,
用QQ视频时可以很正常打开摄像头并显示视频流,
但用OpenCV捕获摄像头时(进行人脸检测或获取视频流),
虽然能打开摄像头,
但不能显示视频流,
一直显示黑屏。
经过百度,找到了有相同问题的同学
http://www.opencv.org.cn/forum/viewtopic.php?t=8259
解决方案为
摄像头基于VFW/WDM?
看看参数,若
1)支持VFW,则应该可以用opencv采到视频
2)不支持VFW,DirectShow+opencv或ds
后来发现我的摄像头使用的驱动是基于DirectShow的,而opencv是使用vfw的接口。所以不能正常地采集数据。显示的都是黑屏。
我后来使用DirectShow的接口来采集就可以了。


根据DirectShow这个关键词 我继续搜索 得到opencv 的网页
http://www.opencv.org.cn/index.php/%E4%BD%BF%E7%94%A8DirectShow%E9%87%87%E9%9B%86%E5%9B%BE%E5%83%8F
结果:运行代码的窗口内容从之前一片灰色变一片黑色。有点变化。
怀疑是视频流的问题
视频流
想到之前视频流处理出现过问题,于是根据提示下载了 xvid,并安装了。
在处理视频流的时候 debug显示CvCapture函数出现问题(或者结构体不匹配)
debug显示
F:\opencv-test\VIDIOS\c.c(6) : error C2275: 'CvCapture' : illegal use of this type as an expression
        e:\opencv\otherlibs\highgui\highgui.h(216) : see declaration of 'CvCapture'
接着后面就一直错下去了 highgui有问题?狂晕
后来听说avi视频的格式帧数上的不同也对兼容性产生影响。具体再说。


7.23 
静态库和动态库的区别 调用 




7.25
GUI接口备注
cvshowimage 彩色图像数据顺序为BGR 和平时看到的RGB不一样哈
P84


7.26
看到视频流处理的地方,mark
Windows下读摄像头视频慢是因为目前CvCapture使用VFW的原因, 
你可以: 
1.搜搜网上别人用DirectShow写的跟opencv结合的读视频代码 
2.可以用cvcam读摄像头视频 
3.用Linux
也可能是曝光问题




7.27
cvcamPlayAVI(const char* file,viod*window,int width,int height,void* callback)
const char* file文件名
viod*window窗口ID
void* callback处理视频流,调用方法void callback(IplImage*image)
pCapture = cvCaptureFromFile(argv[1])
CvCapture* cvCreateFileCapture( const char* filename );
发现两种视频调用函数,但是具体区别还是不大清楚。
cvCaptureFromCAM()是从摄像头获取帧
CvCapture* cvCreateCameraCapture( int index );
P109


8.4
休息一段时间,今天的任务是处理视频播放问题
1首先应该找到一个avi文件
2然后播放调试
3调试摄像头。
关于视频格式问题已经百度到
注:IplImage* cvQueryFrame( CvCapture* capture );
capture
视频获取结构。
      函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。
      发现的问题:打开的*.avi文件中视频压缩采用MS MPEG4 V2标准时可以读取,使用MJPG时无法读取。采用其他标准时有待研究
另一份资料
      K-Lite Code Pack里面包括ffdshow,是一套video codec的组合,它提供
Video For Windows 的接口,OpenCV的这个函数就是用这个接口;
然后用AviSynth这个virtual frame server来包装这个mpeg文件,创建一
个简单的script,比如mobile.avs,里面只有一行:
MpegSource("mobile.mpg")
当然这取决于你的mpeg的文件的压缩方式,也许需要额外的AviSynth的plugin.
装好K-lite Codec和AviSynth之后,你可以先用播放器直接放这个mobile.avs
文件看是否行得通。
视频实际上的读取过程是:
原始视频 -> ffdshow -> AviSynth -> OpenCV -> IplImage


运行例程读视频文件和运动物体检测 的时候甚至连摄像头都无法开启.


又学到一样东西,函数调用出现问题,可能是
project   settings-> c/c++-> Preprocessor   definitions:   _UNICODE,同时去掉 
  _MBCS,然后在link   -->   output   -->   entry-point中,加上wWinMainCRTStartup 


8.20 
由于兼容性问题,已经换成VS2008 VC++ OPENCV2.0了
现在在看摄像头标定。
 
s*m=A*Rt*m
这儿(X, Y, Z)是一个点的世界坐标,(u, v)是点投影在图像平面的坐标,以像素为单位。A被称作摄像机矩阵,或者内参数矩阵。(cx, cy)是基准点(通常在图像的中心),fx, fy是以像素为单位的焦距。所以如果因为某些因素对来自于摄像机的一幅图像升采样或者降采样,所有这些参数(fx, fy, cx和cy)都将被缩放(乘或者除)同样的尺度。内参数矩阵不依赖场景的视图,一旦计算出,可以被重复使用(只要焦距固定)。旋转-平移矩阵[R|t]被称作外参数矩阵,它用来描述相机相对于一个固定场景的运动,或者相反,物体围绕相机的的刚性运动。也就是[R|t]将点(X, Y, Z)的坐标变换到某个坐标系,这个坐标系相对于摄像机来说是固定不变的。


 那个矩阵公式 就是为了得到一个系数。然后通过摄像头图像中的二维位置通过系数 算出三维坐标


8.21
今天我想到一个问题,通过凸透镜成像与针孔成像的原理是不同的,一个是虚像,一个是实像。
 从所用模型不同来分有线性和非线性。
所谓摄像机的线性模型,是指经典的小孔模型。成像过程不服从小孔模型的称为摄像机的非线性模型。线性模型摄像机标定, 用线性方程求解,简单快速,已成为计算机视觉领域的研究热点之一,目前已有大量研究成果。但线性模型不考虑镜头畸变,准确性欠佳;对于非线性模型摄像机标定,考虑了畸变参数,引入了非线性优化,但方法较繁,速度慢,对初值选择和噪声比较敏感,而且非线性搜索并不能保证参数收敛到全局最优解。


使用opencv2.0+vs2008编程步骤
打开VC++ 2008 Express,创建一个Win32控制台程序opencvhello;
选择Solution Explorer里的opencvhello项目,点击鼠标右键,选择Properties,在[链接器 LINKER]的[输入INPUT]中:
为项目的Debug配置增加 [依赖的库 Additional Dependencies]:cxcore200d.lib cv200d.lib highgui200d.lib(注意,文件名cv200d.lib 可能是cv***d.lib等形式,具体应查看D:\Program Files\OpenCV2.0\vc2008\lib。如果使用的是OpenCV2.1,应输入:cxcore210d.lib cv210d.lib highgui210d.lib )
为项目的Release配置增加[依赖的库 Additional Dependencies]:cxcore200.lib cv200.lib highgui200.lib (注意:如果使用的是OpenCV2.1,应输入:cxcore210.lib cv210.lib highgui210.lib)
在 [配置属性 Configuration Properties]- [General] -[字符集 Character Set] 修改为使用“多字节字符集” (由于2008默认是以Unicode字符集编译的)
编译运行下面的例程(需要将lena.jpg文件放在项目目录下)。


生成cmd.exe时出错解决方案
Visual Studio 2005调试程序时老是提示"生成“cmd.exe”时出错". 
------ 已启动生成: 项目: bstore, 配置: 
Debug Win32 ------ 正在编译资源清单... 
正在链接... 
正在嵌入清单... 
项目 : error PRJ0003 : 生成“cmd.exe”时出错。 
生成日志保存在“file://e:\来自C盘\我的文档\Visual Studio 2005 \Projects\bstore\bstore\Debug\BuildLog.htm” 
first - 1 个错误,0 个警告 ========== 
生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
 直接Visual Studio 2005中进行如下设置: 
tools= > Options = > Projects and Solutions - > VC++ Directories page 把$(PATH)改成:$(SystemRoot)\System32;$(SystemRoot) ;$(SystemRoot)\System32\wbem ------ 
已启动生成: 
项目: bstore, 
配置: Debug Win32 ------ 
正在嵌入清单... 
生成日志保存在“file://e:\来自C盘\我的文档\Visual Studio 2005 \Projects\bstore\bstore\Debug\BuildLog.htm” 
0727 - 0 个错误,0 个警告 ========== 
生成: 1 已成功, 0 已失败, 0 最新, 0 已跳过 ==========


8.25
相机标定的方法
  相机标定方法有:传统相机标定法、主动视觉相机标定方法、相机自标定法。
  传统相机标定法需要使用尺寸已知的标定物,通过建立标定物上坐标已知的点与其图像点之间的对应,利用一定的算法获得相机模型的内外参数。根据标定物的不同可分为三维标定物和平面型标定物。三维标定物可由单幅图像进行标定,标定精度较高,但高精密三维标定物的加工和维护较困难。平面型标定物比三维标定物制作简单,精度易保证,但标定时必须采用两幅或两幅以上的图像。传统相机标定法在标定过程中始终需要标定物,且标定物的制作精度会影响标定结果。同时有些场合不适合放置标定物也限制了传统相机标定法的应用。
  目前出现的自标定算法中主要是利用相机运动的约束。相机的运动约束条件太强,因此使得其在实际中并不实用。利用场景约束主要是利用场景中的一些平行或者正交的信息。其中空间平行线在相机图像平面上的交点被称为消失点,它是射影几何中一个非常重要的特征,所以很多学者研究了基于消失点的相机自标定方法。自标定方法灵活性强,可对相机进行在线定标。但由于它是基于绝对二次曲线或曲面的方法,其算法鲁棒性差。
  基于主动视觉的相机标定法是指已知相机的某些运动信息对相机进行标定。该方法不需要标定物,但需要控制相机做某些特殊运动,利用这种运动的特殊性可以计算出相机内部参数。基于主动视觉的相机标定法的优点是算法简单,往往能够获得线性解,故鲁棒性较高,缺点是系统的成本高、实验设备昂贵、实验条件要求高,而且不适合于运动参数位置或无法控制的场合。


现在尝试主动视觉的相机标定法
今天,我通过对笔记本的摄像头截图,收集了两张照片第一张是与竖直方向成30度角拍摄,第二张是沿第一张的拍摄方向水平平移30厘米后拍摄所得。
将第一张图放大与第二张图比较时候,理论上将第一张放大与第二张照片应该可以重合,但是通过比较可知,由于透视,前景相对于背景而言,前景的会显得更大些。


8.28
猜想一:通过摄像头移动距离与摄像头获得的图像放大倍率可以得出图像中目标的具体尺寸。
猜想二:通过改变摄像头的焦点,判断摄像头获得的图像中目标边缘锐度判断图像中目标的相对位置。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值