3.3激光出射角
本实验,需要激光出射是保证出射角为90°,所以也要对出射角进行调试,当激光出射角也定好后,整个作品基本完成,剩下的是对程序进行调试。
调试过程如下:
PC程序设计
4.1摄像头调用
在主程序开始时,利用OpenCV调用摄像头出来。模块代码如下:
HWND MyWin; // 设置系统属性
cvcamSetProperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE);//Enable视讯 //0:欲设置属性的摄像头序号; 第二个参数是属性名字; //第三个参数是指向设置值的指针
cvcamSetProperty(0, CVCAM_PROP_RENDER, CVCAMTRUE); //启用视讯 // MyWin 是窗口 HWND 的类型
MyWin = (HWND) cvGetWindowHandle(\
cvcamSetProperty(0, CVCAM_PROP_WINDOW, &MyWin); // Selects a window
cvcamSetProperty(0,CVCAM_RNDWIDTH,&width); cvcamSetProperty(0,CVCAM_RNDHEIGHT,&height);
//video rendering
//回调函数将处理每一帧
cvcamSetProperty(0, CVCAM_PROP_CALLBACK, callback);
4.2光点定位
光点定位是整个模块的核心,光点定位的准直会直接影响测量的准确性。设计程序如下:
cvcamGetProperty(1,\ int height = img->height; int width = img->width; int step = img->widthStep; int channels = img->nChannels;
uchar* data = (uchar *)img->imageData; int x,y;
int Real_x=0,Real_y=0; int i=0,j=280; int sum_x=0;
int max_light_intensity=250;//人为设定的感光强度 for( x=0;x
for(y=1;y
if(data[y*step+x*channels+2]>max_light_intensity) {
sum_x=sum_x+x; i++; } } }
if(i>0) {
Real_x=sum_x/i;//实际像素点在X轴上的位置 Real_x=Real_x-j;
printf(\符合光强的像素点有%d个\\n\像素点多少,越多证明像素点越大,精确度越差
double L=100*3.85/(Real_x*6); printf(\测得距离为:\ printf(\米\
结论:
本次实验,主要是解决摄像头与激光出射角的定标。但由于是人为确定,并且激光器功率不算太大,只能在较短距离的空间范围内进行定标。其次,程序方面相对容易解决,并且通过程序的优化,确确实实地达到测量精度更加准确。
在这几天的研究制作当中,对摄像头成像的原理有了更深入的了解。同时,意识到在程序更进一步的优化还是有不懂的地方,这需要我们在后续的工作更着重分析、研究。通过这次的研究实验,在团队的合力之下。解决了遇到的绝大部分问题,虽然不足之处还是存在,例如不能测5m之外的距离。但在短距离20cm到150cm之内还是能较准确地得到测量距离,总体上实现了计划之初的目标。