StereoBM:opencv计算视差

来源:互联网 发布:mac唇部打底好用吗 编辑:程序博客网 时间:2024/06/05 11:18

0.前言
视差与深度的关系戳这里。在opencv里应该有三种求视差的方法和一些问题集锦,可参考:http://blog.csdn.net/chenyusiyuan/article/details/5967291/
1.代码

void saveDisp(const char* filename, Mat mat);int main(){    char* filename = "../disparity_value.txt";    Mat left = imread("../image/left_199.png",CV_LOAD_IMAGE_GRAYSCALE);    Mat right = imread("../image/right_199.png",CV_LOAD_IMAGE_GRAYSCALE);    double t = (double)getTickCount();    Mat disp;    StereoBM bm;      CvStereoBMState *BMState = cvCreateStereoBMState();    bm.state->SADWindowSize = 15;      bm.state->minDisparity = 0;      bm.state->numberOfDisparities = 80;      bm.state->textureThreshold = 10;      bm.state->uniquenessRatio = 8;      bm.state->speckleWindowSize = 10;      bm.state->speckleRange = 32;      bm.state->disp12MaxDiff = -1;      /*防止左侧黑边*/    copyMakeBorder(left, left, 0, 0, 80, 0, IPL_BORDER_REPLICATE);      copyMakeBorder(right, right, 0, 0, 80, 0, IPL_BORDER_REPLICATE);      bm.operator()(left,right,disp,CV_32F);    disp = disp.colRange(80, left.cols);      t = ((double)getTickCount() - t)/getTickFrequency();    cout<<"time:"<<t<<endl;    imshow("disp",disp);    saveDisp(filename,disp);    cvWaitKey(0);    return 0;}/**将视差保存到txt,用于MATLAB读取**/void saveDisp(const char* filename,  Mat mat)       {    int ih = mat.type();    //float disp = mat.at<float>(0,0);     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++)        {            float disp = mat.at<float>(y, x); // 这里视差矩阵是CV_16S 格式的,故用 short 类型读取            fprintf(fp, "%f\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; % 使坐标轴显示范围与数据范围相贴合,去除空白显示区

这里写图片描述

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁宝宝牙龈肿痛怎么办 1岁宝宝牙龈肿痛怎么办 牙疼引起的发烧怎么办 2岁小儿牙龈红肿怎么办 宝宝出牙牙龈红肿怎么办 3岁宝宝牙龈红肿怎么办 1岁宝宝牙龈红肿怎么办 4岁宝宝牙龈红肿怎么办 儿童牙黑了怎么办啊 牙黑了掉了一块怎么办 1岁幼儿牙齿腐蚀怎么办 我的大牙变黑了怎么办 牙齿里面黑了疼怎么办 最里面的牙黑了怎么办 牙龈的肉裂开了怎么办 有蛀牙怎么办可以变好么 拔智齿没拔干净怎么办 蛀牙只剩牙根了怎么办 牙掉的就剩牙根怎么办 蛀牙牙冠都掉了怎么办 拔智齿断了牙根怎么办 牙肉肿痛有脓包怎么办 种植牙到寿命后怎么办 牙齿松动快掉了怎么办 一颗牙齿松动了怎么办 种植牙牙冠掉了怎么办 牙就剩下牙根了怎么办 后面的大牙掉了怎么办 两边大牙都没了怎么办 拔牙把牙根断了怎么办 拔乳牙牙根断了怎么办 拔牙时牙根断了怎么办 孕晚期牙根掉了怎么办 根管治疗后牙裂怎么办 智齿拔断了牙根怎么办 大牙断了牙根还在怎么办 孕妇牙疼的要命怎么办 牙烂了个大窟窿怎么办 牙齿又痒又痛怎么办 大牙就剩牙根了怎么办 蛀牙只剩牙根痛怎么办