当前位置: 首页 > news >正文

跨境电商导购网站建设深圳恒诚信企业管理有限公司

跨境电商导购网站建设,深圳恒诚信企业管理有限公司,渠道网关,成都有什么好玩的地方 排行榜立体匹配主要是通过找出每对图像间的对应关系#xff0c;根据三角测量原理#xff0c;得到视差图#xff1b;在获得了视差信息后#xff0c;根据投影模型很容易地可以得到原始图像的深度信息和三维信息。立体匹配技术被普遍认为是立体视觉中最困难也是最关键的问题#xf… 立体匹配主要是通过找出每对图像间的对应关系根据三角测量原理得到视差图在获得了视差信息后根据投影模型很容易地可以得到原始图像的深度信息和三维信息。立体匹配技术被普遍认为是立体视觉中最困难也是最关键的问题主要是以下因素的影响 1 光学失真和噪声亮度、色调、饱和度等失衡 2 平滑表面的镜面反射 3 投影缩减Foreshortening 4 透视失真Perspective distortions 5 低纹理Low texture 6 重复纹理Repetitive/ambiguous patterns 7 透明物体 8 重叠和非连续 目前立体匹配算法是计算机视觉中的一个难点和热点算法很多但是一般的步骤是 A、匹配代价计算 匹配代价计算是整个立体匹配算法的基础实际是对不同视差下进行灰度相似性测量。常见的方法有灰度差的平方SDsquared intensity differences灰度差的绝对值ADabsolute intensity differences等。另外在求原始匹配代价时可以设定一个上限值来减弱叠加过程中的误匹配的影响。以AD法求匹配代价为例可用下式进行计算其中T为设定的阈值。 B、 匹配代价叠加 一般来说全局算法基于原始匹配代价进行后续算法计算。而区域算法则需要通过窗口叠加来增强匹配代价的可靠性根据原始匹配代价不同可分为 C、 视差获取 对于区域算法来说在完成匹配代价的叠加以后视差的获取就很容易了只需在一定范围内选取叠加匹配代价最优的点SAD和SSD取最小值NCC取最大值作为对应匹配点如胜者为王算法WTAWinner-take-all。而全局算法则直接对原始匹配代价进行处理一般会先给出一个能量评价函数然后通过不同的优化算法来求得能量的最小值同时每个点的视差值也就计算出来了。 D、视差细化亚像素级 大多数立体匹配算法计算出来的视差都是一些离散的特定整数值可满足一般应用的精度要求。但在一些精度要求比较高的场合如精确的三维重构中就需要在初始视差获取后采用一些措施对视差进行细化如匹配代价的曲线拟合、图像滤波、图像分割等。 有关立体匹配的介绍和常见匹配算法的比较推荐大家看看Stefano Mattoccia 的讲义 Stereo Vision: algorithms and applications190页的ppt讲解得非常形象详尽。 1 opencv2.1和opencv2.0在做stereo vision方面有什么区别了 2.1版增强了Stereo Vision方面的功能 (1) 新增了 SGBM 立体匹配算法源自Heiko Hirschmuller的《Stereo Processing by Semi-global Matching and Mutual Information》可以获得比 BM 算法物体轮廓更清晰的视差图但低纹理区域容易出现横/斜纹路在 GCstate-fullDP 选项使能时可消减这种异常纹路但对应区域视差变为0且运行速度会有所下降速度比 BM 稍慢 352*288的帧处理速度大约是 5 帧/秒 (2) 视差效果BM SGBM GC处理速度BM SGBM GC (3) BM 算法比2.0版性能有所提升其状态参数新增了对左右视图感兴趣区域 ROI 的支持roi1 和 roi2由stereoRectify函数产生 (4) BM 算法和 GC 算法的核心代码改动不大主要是面向多线程运算方面的由 OpenMP 转向 Intel TBB (5) cvFindStereoCorrespondenceBM 函数的disparity参数的数据格式新增了 CV_32F 的支持这种格式的数据给出实际视差而 2.0 版只支持 CV_16S需要除以 16.0 才能得到实际的视差数值。 2 用于立体匹配的图像可以是彩色的吗 在OpenCV2.1中BM和GC算法只能对8位灰度图像计算视差SGBM算法则可以处理24位8bits*3彩色图像。所以在读入图像时应该根据采用的算法来处理图像 int color_mode alg STEREO_SGBM ? 1 : 0; // // 载入图像 cvGrabFrame( lfCam ); cvGrabFrame( riCam ); frame1 cvRetrieveFrame( lfCam ); frame2 cvRetrieveFrame( riCam ); if(frame1.empty()) break; resize(frame1, img1, img_size, 0, 0); resize(frame2, img2, img_size, 0, 0); // 选择彩色或灰度格式作为双目匹配的处理图像 if (!color_mode cn1) { cvtColor(img1, img1gray, CV_BGR2GRAY); cvtColor(img2, img2gray, CV_BGR2GRAY); img1p img1gray; img2p img2gray; } else { img1p img1; img2p img2; }3 怎样获取与原图像有效像素区域相同的视差图 在 OpenCV2.0及以前的版本中所获取的视差图总是在左侧和右侧有明显的黑色区域这些区域没有有效的视差数据。视差图有效像素区域 与视差窗口ndisp一般取正值且能被16整除和最小视差值mindisp一般取0或负值相关视差窗口越大视差图左侧的黑色区域越大最小视差值越小视差图右侧的黑色区域越大。其原因是为了保证参考图像一般是左视图的像素点能在目标图像右视图中按照设定的视差匹配窗口匹配对应点 OpenCV 只从参考图像的第 (ndisp - 1 mindisp) 列开始向右计算视差第 0 列到第 (ndisp - 1 mindisp) 列的区域视差统一设置为 (mindisp - 1) *16视差计算到第 width mindisp 列时停止余下的右侧区域视差值也统一设置为 (mindisp - 1) *16。00177 static const int DISPARITY_SHIFT 4; … 00411 int ndisp state-numberOfDisparities; 00412 int mindisp state-minDisparity; 00413 int lofs MAX(ndisp - 1 mindisp, 0); 00414 int rofs -MIN(ndisp - 1 mindisp, 0); 00415 int width left-cols, height left-rows; 00416 int width1 width - rofs - ndisp 1; … 00420 short FILTERED (short)((mindisp - 1) DISPARITY_SHIFT); … 00466 // initialize the left and right borders of the disparity map 00467 for( y 0; y height; y ) 00468 { 00469 for( x 0; x lofs; x ) 00470 dptr[y*dstep x] FILTERED; 00471 for( x lofs width1; x width; x ) 00472 dptr[y*dstep x] FILTERED; 00473 } 00474 dptr lofs; 00475 00476 for( x 0; x width1; x, dptr )…这样的设置很明显是不符合实际应用的需求的它相当于把摄像头的视场范围缩窄了。因此 OpenCV2.1 做了明显的改进不再要求左右视图和视差图的大小size一致 允许对视差图进行左右边界延拓这样虽然计算视差时还是按上面的代码思路来处理左右边界但是视差图的边界得到延拓后有效视差的范围就能够与对应视图完全对应。具体的实现代码范例如下// // 对左右视图的左边进行边界延拓以获取与原始视图相同大小的有效视差区域 copyMakeBorder(img1r, img1b, 0, 0, m_nMaxDisp, 0, IPL_BORDER_REPLICATE); copyMakeBorder(img2r, img2b, 0, 0, m_nMaxDisp, 0, IPL_BORDER_REPLICATE);// // 计算视差 if( alg STEREO_BM ) {bm(img1b, img2b, dispb);// 截取与原始画面对应的视差区域舍去加宽的部分displf dispb.colRange(m_nMaxDisp, img1b.cols); } else if(alg STEREO_SGBM) {sgbm(img1b, img2b, dispb);displf dispb.colRange(m_nMaxDisp, img1b.cols); }4 cvFindStereoCorrespondenceBM的输出结果好像不是以像素点为单位的视差 “scyscyao在OpenCV2.0中BM函数得出的结果是以16位符号数的形式的存储的出于精度需要所有的视差在输出时都扩大了16倍(2^4)。其具体代码表示如下 dptr[y*dstep] (short)(((ndisp - mind - 1 mindisp)*256 (d ! 0 ? (p-n)*128/d : 0) 15) 4); 可以看到原始视差在左移8位(256)并且加上一个修正值之后又右移了4位最终的结果就是左移4位。 因此在实际求距离时cvReprojectTo3D出来的X/W,Y/W,Z/W都要乘以16 (也就是W除以16)才能得到正确的三维坐标信息。” 在OpenCV2.1中BM算法可以用 CV_16S 或者 CV_32F 的方式输出视差数据使用32位float格式可以得到真实的视差值而CV_16S 格式得到的视差矩阵则需要 除以16 才能得到正确的视差。另外OpenCV2.1另外两种立体匹配算法 SGBM 和 GC 只支持 CV_16S 格式的 disparity 矩阵。 5 如何设置BM、SGBM和GC算法的状态参数 1StereoBMState // 预处理滤波参数 preFilterType预处理滤波器的类型主要是用于降低亮度失真photometric distortions、消除噪声和增强纹理等, 有两种可选类型CV_STEREO_BM_NORMALIZED_RESPONSE归一化响应 或者 CV_STEREO_BM_XSOBEL水平方向Sobel算子默认类型, 该参数为 int 型preFilterSize预处理滤波器窗口大小容许范围是[5,255]一般应该在 5x5..21x21 之间参数必须为奇数值, int 型preFilterCap预处理滤波器的截断值预处理的输出值仅保留[-preFilterCap, preFilterCap]范围内的值参数范围1 - 31文档中是31但代码中是 63, int // SAD 参数 SADWindowSizeSAD窗口大小容许范围是[5,255]一般应该在 5x5 至 21x21 之间参数必须是奇数int 型minDisparity最小视差默认值为 0, 可以是负值int 型numberOfDisparities视差窗口即最大视差值与最小视差值之差, 窗口大小必须是 16 的整数倍int 型 // 后处理参数 textureThreshold低纹理区域的判断阈值。如果当前SAD窗口内所有邻居像素点的x导数绝对值之和小于指定阈值则该窗口对应的像素点的视差值为 0That is, if the sum of absolute values of x-derivatives computed over SADWindowSize by SADWindowSize pixel neighborhood is smaller than the parameter, no disparity is computed at the pixel该参数不能为负值int 型uniquenessRatio视差唯一性百分比 视差窗口范围内最低代价是次低代价的(1 uniquenessRatio/100)倍时最低代价对应的视差值才是该像素点的视差否则该像素点的视差为 0 the minimum margin in percents between the best (minimum) cost function value and the second best value to accept the computed disparity, that is, accept the computed disparity d^ only if SAD(d) SAD(d^) x (1 uniquenessRatio/100.) for any d ! d*/-1 within the search range 该参数不能为负值一般5-15左右的值比较合适int 型speckleWindowSize检查视差连通区域变化度的窗口大小, 值为 0 时取消 speckle 检查int 型speckleRange视差变化阈值当窗口内视差变化大于阈值时该窗口内的视差清零int 型 // OpenCV2.1 新增的状态参数 roi1, roi2左右视图的有效像素区域一般由双目校正阶段的 cvStereoRectify 函数传递也可以自行设定。一旦在状态参数中设定了 roi1 和 roi2OpenCV 会通过cvGetValidDisparityROI 函数计算出视差图的有效区域在有效区域外的视差值将被清零。disp12MaxDiff左视差图直接计算得出和右视差图通过cvValidateDisparity计算得出之间的最大容许差异。超过该阈值的视差值将被清零。该参数默认为 -1即不执行左右视差检查。int 型。注意在程序调试阶段最好保持该值为 -1以便查看不同视差窗口生成的视差效果。具体请参见《使用OpenGL动态显示双目视觉三维重构效果示例》一文中的讨论。 在上述参数中对视差生成效果影响较大的主要参数是 SADWindowSize、numberOfDisparities 和 uniquenessRatio 三个一般只需对这三个参数进行调整其余参数按默认设置即可。 在OpenCV2.1中BM算法有C和C 两种实现模块。 2StereoSGBMState SGBM算法的状态参数大部分与BM算法的一致下面只解释不同的部分 SADWindowSizeSAD窗口大小容许范围是[1,11]一般应该在 3x3 至 11x11 之间参数必须是奇数int 型P1, P2控制视差变化平滑性的参数。P1、P2的值越大视差越平滑。P1是相邻像素点视差增/减 1 时的惩罚系数P2是相邻像素点视差变化值大于1时的惩罚系数。P2必须大于P1。OpenCV2.1提供的例程 stereo_match.cpp 给出了 P1 和 P2 比较合适的数值。fullDP布尔值当设置为 TRUE 时运行双通道动态编程算法full-scale 2-pass dynamic programming algorithm会占用O(W*H*numDisparities)个字节对于高分辨率图像将占用较大的内存空间。一般设置为 FALSE。 注意OpenCV2.1的SGBM算法是用C 语言编写的没有C实现模块。与H. Hirschmuller提出的原算法相比主要有如下变化 算法默认运行单通道DP算法只用了5个方向而fullDP使能时则使用8个方向可能需要占用大量内存。算法在计算匹配代价函数时采用块匹配方法而非像素匹配不过SADWindowSize1时就等于像素匹配了。匹配代价的计算采用BT算法Depth Discontinuities by Pixel-to-Pixel Stereo by S. Birchfield and C. Tomasi并没有实现基于互熵信息的匹配代价计算。增加了一些BM算法中的预处理和后处理程序。 3StereoGCState GC算法的状态参数只有两个numberOfDisparities 和 maxIters 并且只能通过 cvCreateStereoGCState 在创建算法状态结构体时一次性确定不能在循环中更新状态信息。GC算法并不是一种实时算法但可以得到物体轮廓清晰准确的视差图适用于静态环境物体的深度重构。 注意GC算法只能在C语言模式下运行并且不能对视差图进行预先的边界延拓左右视图和左右视差矩阵的大小必须一致。 6 如何实现视差图的伪彩色显示 首先要将16位符号整形的视差矩阵转换为8位无符号整形矩阵然后按照一定的变换关系进行伪彩色处理。我的实现代码如下 // 转换为 CV_8U 格式彩色显示 dispLfcv displf, dispRicv dispri, disp8cv disp8; if (alg STEREO_GC) {cvNormalize( dispLfcv, disp8cv, 0, 256, CV_MINMAX ); } else {displf.convertTo(disp8, CV_8U, 255/(m_nMaxDisp*16.)); } F_Gray2Color(disp8cv, vdispRGB);灰度图转伪彩色图的代码主要功能是使灰度图中 亮度越高的像素点在伪彩色图中对应的点越趋向于 红色亮度越低则对应的伪彩色越趋向于 蓝色总体上按照灰度值高低由红渐变至蓝中间色为绿色。其对应关系如下图所示void F_Gray2Color(CvMat* gray_mat, CvMat* color_mat) {if(color_mat)cvZero(color_mat);int stype CV_MAT_TYPE(gray_mat-type), dtype CV_MAT_TYPE(color_mat-type);int rows gray_mat-rows, cols gray_mat-cols;// 判断输入的灰度图和输出的伪彩色图是否大小相同、格式是否符合要求if (CV_ARE_SIZES_EQ(gray_mat, color_mat) stype CV_8UC1 dtype CV_8UC3){CvMat* red cvCreateMat(gray_mat-rows, gray_mat-cols, CV_8U);CvMat* green cvCreateMat(gray_mat-rows, gray_mat-cols, CV_8U);CvMat* blue cvCreateMat(gray_mat-rows, gray_mat-cols, CV_8U);CvMat* mask cvCreateMat(gray_mat-rows, gray_mat-cols, CV_8U);// 计算各彩色通道的像素值cvSubRS(gray_mat, cvScalar(255), blue); // blue(I) 255 - gray(I)cvCopy(gray_mat, red); // red(I) gray(I)cvCopy(gray_mat, green); // green(I) gray(I),if gray(I) 128cvCmpS(green, 128, mask, CV_CMP_GE ); // green(I) 255 - gray(I), if gray(I) 128cvSubRS(green, cvScalar(255), green, mask);cvConvertScale(green, green, 2.0, 0.0);// 合成伪彩色图cvMerge(blue, green, red, NULL, color_mat);cvReleaseMat( red );cvReleaseMat( green );cvReleaseMat( blue );cvReleaseMat( mask );} }7 如何将视差数据保存为 txt 数据文件以便在 Matlab 中读取分析 由于OpenCV本身只支持 xml、yml 的数据文件读写功能并且其xml文件与构建网页数据所用的xml文件格式不一致在Matlab中无法读取。我们可以通过以下方式将视差数据保存为txt文件再导入到Matlab中。 void saveDisp(const char* filename, const Mat mat) {FILE* fp fopen(filename, wt);fprintf(fp, %02d/n, mat.rows);fprintf(fp, %02d/n, mat.cols);for(int y 0; y mat.rows; y){for(int x 0; x mat.cols; x){short disp mat.atshort(y, x); // 这里视差矩阵是CV_16S 格式的故用 short 类型读取fprintf(fp, %d/n, disp); // 若视差矩阵是 CV_32F 格式则用 float 类型读取}}fclose(fp); }相应的Matlab代码为function img txt2img(filename) data importdata(filename); r data(1); % 行数 c data(2); % 列数 disp data(3:end); % 视差 vmin min(disp); vmax max(disp); disp reshape(disp, [c,r]); % 将列向量形式的 disp 重构为 矩阵形式 % OpenCV 是行扫描存储图像Matlab 是列扫描存储图像 % 故对 disp 的重新排列是首先变成 c 行 r 列的矩阵然后再转置回 r 行 c 列 img uint8( 255 * ( disp - vmin ) / ( vmax - vmin ) ); mesh(disp); set(gca,YDir,reverse); % 通过 mesh 方式绘图时需倒置 Y 轴方向 axis tight; % 使坐标轴显示范围与数据范围相贴合去除空白显示区显示效果如下
http://wiki.neutronadmin.com/news/242291/

相关文章:

  • 男女做视频观看网站wordpress教程文档下载
  • 软件开发培训机构找极客时间西安优化网站公司
  • 淘宝做网站的都是模板万城建设网站
  • 网站开发获取用户微信号登录做商城外贸网站
  • 如何通过网站后台修改网站电商网站设计规范
  • 管理网站 开发黔西南做网站的有几家
  • 浙江省建设厅 网站是多少怎么看网站开发的发展
  • 网站备案时间也太慢了百度云搜索引擎入口百度网盘
  • 阿里云有主体新增网站简历网站有哪些
  • 用js做网站登录北京数据优化公司
  • 贵阳网站建设三思网络长春建设网站公司哪家好
  • 学信网 的企业网站给你做认证湘阴网站建设
  • 织梦做有网站有后台 能下载备份所有代码文件么哪个网站企业邮箱最好
  • 做头像的网站空白桂林人才网
  • 如何建视频网站软文代写是什么
  • 行知智网站开发精准广告投放
  • 自己做的微课上传到哪个网站专业的临沂网站优化
  • 企业一站式网站建设做免费网站教程国vs
  • 自己做服务器的网站吗xml网站地图每天更新
  • 做网站怎么字体全部变粗了设计培训班大概多少钱
  • 网站开发如何让图片加载的更快福田做棋牌网站建设找哪家效益快
  • 织梦网站如何做伪静态wordpress增加内存
  • 杭州模板网站wordpress视频大小自由适配屏幕
  • 佛山网站建设公司排行丹东有做公司网站的吗
  • 曹县商城网站建设云主机添加网站
  • 中英文的网站怎么建设中山网站建设 骏域
  • 北京网站排名优化软件wordpress主题 游戏
  • 什么是网页和网站要压实互联网企业的什么责任
  • 如何做网络集资网站wordpress 分类图片尺寸
  • seo网站推广价格模板网站购买