资源预览内容
第1页 / 共15页
第2页 / 共15页
第3页 / 共15页
第4页 / 共15页
第5页 / 共15页
第6页 / 共15页
第7页 / 共15页
第8页 / 共15页
第9页 / 共15页
第10页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
OpenCVOpenCV 学习笔记 学习笔记 1515 使用 使用 OpenGLOpenGL 显示双目视觉三维重构效果显示双目视觉三维重构效果 上一篇笔记中使用 Matlab 初步显示了双目视觉重构出的环境三维效果图 不过并没有加上纹理信息 在 OpenCV 中文论坛里 大象的帖子 using namespace cv Detect Memory Leaks or comment ifdef DEBUG CMemLeakDetect memLeakDetect endif enum STEREO BM 0 STEREO SGBM 1 int alg STEREO BM int stereo rectify 1 adaptThresh 1 int SADWindowSize 15 numberOfDisparities 64 SADWS alpha 8 MaxDisp beta 4 uniqRatio 25 thresRatio 60 int saveFrames 1 bool fullDP false double m ObjectWidth 10 0 0 目标宽度 double m ObjectHeight 10 0 0 目标高度 double m ObjectDisparity 10 0 0 视差 double m ObjectDistance 10 0 0 距离 char img1name 100 img2name 100 dispImgName 100 dispDataName 100 OpenGL float imgdata 500 500 3 存放三维坐标数据 float texture 500 500 3 存放纹理数据 int width 0 height 0 rx 0 ry 0 int eyex 115 eyez 115 atx 100 atz 50 float scalar 1 scalar of converting pixel color to float coordinates 二 OpenGL 响应函数 在大象帖子的跟帖中 villager5villager5 综合了一小段代码 随着鼠标移动 可以从多个视角观看生成的三 维点云图 我在其基础上做了修改 为了与 OpenCV 循环同步 去掉了鼠标移动的响应函数 villager5villager5 的代码里用了定时器 改为使用 OpenCV 的 TrackBar 来调整 OpenGL 函数 glLookAt 的视角 另外 对于纹理映射 我暂时用一种简化的方式来实现 即直接把帧画面的纹理数据 RGB 值 赋值 到点云的颜色中 glColor3f 这样的做法缺点是显示的三维点云是分块 不连续的 前方的点云块 后面是黑色空洞 接下来会继续尝试按正常的纹理映射方法来实现 最终实现的效果应该是类 似大 象帖子中提到的 Structure From Motion 软件所实现的效果 view plaincopy to clipboardprint OpenGL 响应函数 功能键 方向键 响应函数 void special int key int x int y switch key case GLUT KEY LEFT ry 5 glutPostRedisplay break case GLUT KEY RIGHT ry 5 glutPostRedisplay break case GLUT KEY UP rx 5 glutPostRedisplay break case GLUT KEY DOWN rx 5 glutPostRedisplay break 三维图像显示响应函数 void renderScene void glClear GL COLOR BUFFER BIT glLoadIdentity Reset the coordinate system before modifying gluLookAt eyex 100 0 0 eyez 100 0 atx 100 0 0 0 atz 100 0 0 0 1 0 0 0 根据滑动块位置变换 OpenGL 摄像机 视角 glRotatef ry 0 0 1 0 0 0 rotate about the z axis 根据键盘方向键按键消息变换摄像机视角 glRotatef rx 180 1 0 0 0 0 0 rotate about the y axis float x y z glPointSize 1 0 glBegin GL POINTS GL POINTS for int i 0 i height i for int j 0 j width j glColor3f texture i j 0 255 texture i j 1 255 texture i j 2 255 将图像纹理赋值到点云上 x imgdata i j 0 scalar 添加负号以获得正确的左右上下方位 y imgdata i j 1 scalar z imgdata i j 2 scalar glVertex3f x y z glEnd glFlush 窗口变化图像重构响应函数 void reshape int w int h glViewport 0 0 GLsizei w GLsizei h glMatrixMode GL PROJECTION glLoadIdentity gluPerspective 60 GLfloat w GLfloat h 1 0 500 0 显示 1 500 距离单位 这里是 cm 内的点云 glMatrixMode GL MODELVIEW 载入三维坐标数据 void load3dDataToGL IplImage img3d CvScalar s accessing the image pixels for int i 0 i height i for int j 0 j width j s cvGet2D img3d i j s val 0 x s val 1 y s val 2 z imgdata i j 0 s val 0 imgdata i j 1 s val 1 imgdata i j 2 fabs s val 2 载入左视图纹理数据 void loadTextureToGL IplImage img int ind 0 CvScalar ss accessing the image pixels for int i 0 i height i for int j 0 jcols rows left rows 00716 int row0 min cvRound range begin rows nstripes rows 00717 int row1 min cvRound range end rows nstripes rows 00718 uchar ptr state slidingSumBuf data ptr range begin stripeBufSize 00719 int FILTERED state minDisparity 1 16 00720 00721 Rect roi validDisparityRect 00722 if roi height 0 00723 return 00724 int row0 roi y 00725 int row1 roi y roi height 00741 Mat disp i disp rowRange row0 row1 00742 Mat cost i state disp12MaxDiff 0 Mat state cost rowRange row0 row1 Mat 00751 if state disp12MaxDiff 0 00752 validateDisparity disp i cost i state minDisparity state numberOfDisparities state disp12MaxDiff 这个 validateDisparity 函数是在 OpenCV2 1 0 src cv cvstereosgbm cpp 中定义的 刚才说到的 出错 源自以下代码的参数检查 view plaincopy to clipboardprint 00969 CV Assert numberOfDisparities 0 增大增大 numberOfDisparity numberOfDisparity 时是正常的 满足时是正常的 满足 disp size codisp size cost size st size 但一旦减少 但一旦减少 numberOfDisparity numberOfDisparity 条件 条件 disp size cost size disp size cost size 就不能满足 从而提示出错 至于为什就不能满足 从而提示出错 至于为什 么不能满足该条件 我还没分析出来 调试经验不足 这个么不能满足该条件 我还没分析出来 调试经验不足 这个 AssertAssert 错误需要在程序运行遇到减少错误需要在程序运行遇到减少 numberOfDisparity numberOfDisparity 的情况才会出错 不知道如何设置的情况才会出错 不知道如何设置 breakpoint breakpoint 使其只有使其只有 numberOfDisparity numberOfDisparity 减少时才生效 麻烦大家帮忙分析下啦减少时才生效 麻烦大家帮忙分析下啦 O O 在获取视差数据后 就可以利用 cv reprojectImageTo3D 来计算三维坐标数据 另外我还编写了一 个子程序 DoDetectNearObj 用于检测离摄像头最近的物体 view plaincopy to clipboardprint 双目匹配求解器状态初始化 bm state roi1 roi1 bm state roi2 roi2 bm state preFilterCap 31 bm state minDisparity 0 bm state textureThreshold 10 bm state speckleWindowSize 100 bm state speckleRange 32 bm state disp12MaxDiff 1 sgbm preFilterCap 63 sgbm minDisparity 0 sgbm speckleWindowSize bm state speckleWindowSize sgbm speckleRange bm state speckleRange sgbm disp12MaxDiff 1 for 求解器动态参数调整 bm state SADWindowSize SADWindowSize bm state numberOfDisparities numberOfDisparities bm state uniquenessRatio uniqRatio sgbm SADWindowSize SADWindowSize sgbm P1 8 cn sgbm SADWindowSize sgbm SADWindowSize sgbm P2 32 cn sgbm SADWindowSize sgbm SADWindowSize sgbm numberOfDisparities numberOfDisparities sgbm uniquenessRatio uniqRatio sgbm fullDP fullDP 检测离摄像头最近的物体 img1Ipl img1c img2Ipl img2c cvZero bi img if stereo rectify reprojectImageTo3D displf img3d Q true
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号