计算下列两幅图的视差图

程序在vs2017+OpenCV3.4.1中测试通过

原图

 

左图                                                                         右图

SAD算法测试

SGBM算法测试

采用了SGBM算法,效果相比于SAD算法要好,但是复杂度提升,计算时间要长。

SAD程序

// SAD.cpp
#include "pch.h"
#include <iostream>#include<iostream>
#include<opencv2/opencv.hpp>using namespace std;
using namespace cv;class SAD
{
private:int winSize;//卷积核尺寸int DSR;//视差搜索范围
public:SAD() :winSize(7), DSR(30) {}SAD(int _winSize, int _DSR) :winSize(_winSize), DSR(_DSR) {}Mat computerSAD(Mat&L, Mat&R);//计算SAD
};Mat SAD::computerSAD(Mat&L, Mat&R)
{int Height = L.rows;int Width = L.cols;Mat Kernel_L(Size(winSize, winSize), CV_8U, Scalar::all(0));//CV_8U:0~255的值,大多数图像/视频的格式,该段设置全0矩阵Mat Kernel_R(Size(winSize, winSize), CV_8U, Scalar::all(0));Mat Disparity(Height, Width, CV_8U, Scalar(0));for (int i = 0; i < Width - winSize; ++i) {for (int j = 0; j < Height - winSize; ++j) {Kernel_L = L(Rect(i, j, winSize, winSize));//L为做图像,Kernel为这个范围内的左图Mat MM(1, DSR, CV_32F, Scalar(0));//定义匹配范围for (int k = 0; k < DSR; ++k) {int x = i - k;if (x >= 0) {Kernel_R = R(Rect(x, j, winSize, winSize));Mat Dif;absdiff(Kernel_L, Kernel_R, Dif);Scalar ADD = sum(Dif);float a = ADD[0];MM.at<float>(k) = a;}Point minLoc;minMaxLoc(MM, NULL, NULL, &minLoc, NULL);int loc = minLoc.x;Disparity.at<char>(j, i) = loc * 16;}double rate = double(i) / (Width);cout << "已完成" << setprecision(2) << rate * 100 << "%" << endl;}}return Disparity;
}int main()
{Mat left = imread("1.png");Mat right = imread("2.png");//-------图像显示-----------imshow("leftimag 1210", left);imshow("rightimag 1210", right);//--------由SAD求取视差图-----Mat Disparity;SAD mySAD(7, 30);Disparity = mySAD.computerSAD(left, right);//-------结果显示------  imshow("Disparity1210", Disparity);//-------收尾------waitKey(0);return 0;
}

SGBM程序

// SGBM.cpp
#include "pch.h"
#include <iostream>#include<iostream>
#include<opencv2/opencv.hpp>using namespace std;
using namespace cv;class SGBM
{
private:enum mode_view { LEFT, RIGHT };mode_view view;  //输出左视差图or右视差图public:SGBM() {};SGBM(mode_view _mode_view) :view(_mode_view) {};~SGBM() {};Mat computersgbm(Mat &L, Mat &R); //计算SGBM
};Mat SGBM::computersgbm(Mat &L, Mat &R)
/*SGBM_matching SGBM算法
*@param Mat &left_image :左图像
*@param Mat &right_image:右图像
*/
{Mat disp;int numberOfDisparities = ((L.size().width / 8) + 15)&-16;Ptr<StereoSGBM> sgbm = StereoSGBM::create(0, 16, 3);sgbm->setPreFilterCap(32);int SADWindowSize = 5;int sgbmWinSize = SADWindowSize > 0 ? SADWindowSize : 3;sgbm->setBlockSize(sgbmWinSize);int cn = L.channels();sgbm->setP1(8 * cn*sgbmWinSize*sgbmWinSize);sgbm->setP2(32 * cn*sgbmWinSize*sgbmWinSize);sgbm->setMinDisparity(0);sgbm->setNumDisparities(numberOfDisparities);sgbm->setUniquenessRatio(10);sgbm->setSpeckleWindowSize(100);sgbm->setSpeckleRange(32);sgbm->setDisp12MaxDiff(1);Mat left_gray, right_gray;cvtColor(L, left_gray, CV_BGR2GRAY);cvtColor(R, right_gray, CV_BGR2GRAY);view = LEFT;if (view == LEFT)  //计算左视差图{sgbm->compute(left_gray, right_gray, disp);disp.convertTo(disp, CV_32F, 1.0 / 16);          //除以16得到真实视差值Mat disp8U = Mat(disp.rows, disp.cols, CV_8UC1);normalize(disp, disp8U, 0, 255, NORM_MINMAX, CV_8UC1);imwrite("results/SGBM.jpg", disp8U);return disp8U;}else if (view == RIGHT)  //计算右视差图{sgbm->setMinDisparity(-numberOfDisparities);sgbm->setNumDisparities(numberOfDisparities);sgbm->compute(left_gray, right_gray, disp);disp.convertTo(disp, CV_32F, 1.0 / 16);           //除以16得到真实视差值Mat disp8U = Mat(disp.rows, disp.cols, CV_8UC1);normalize(disp, disp8U, 0, 255, NORM_MINMAX, CV_8UC1);imwrite("results/SGBM.jpg", disp8U);return disp8U;}else{return Mat();}
}int main()
{Mat left = imread("1.png");Mat right = imread("2.png");//-------图像显示-----------imshow("leftimag 1210", left);imshow("rightimag 1210", right);//--------由SAD求取视差图-----Mat Disparity;SGBM mySGBM;Disparity = mySGBM.computersgbm(left, right);//-------结果显示------imshow("Disparity 1210", Disparity);//-------收尾------waitKey(0);return 0;
}

【OpenCV】计算两幅图片视觉差相关推荐

  1. C# 获取当前月第一天和最后一天 计算两个日期差多少天

    获取当前月的第一天和最后一天 DateTime now = DateTime.Now; DateTime firstDay = new DateTime(now.Year, now.Month, 1) ...

  2. 计算两日期之间差多少天----日期格式为:yyyy-mm-dd

    计算两日期之间差多少天 日期格式为yyyy-mm-dd //计算日期差值的方法: //计算日期差值的方法: function getDaysBetween(dateString1, dateStrin ...

  3. 计算两个数之差的绝对值

    程序: #include <stdio.h>//从键盘输入两个整数 ,调用库函数 计算两个数之差的绝对值 //带符号相减int SBB(int a,int b) {int S = 0;S ...

  4. sql 计算两个日期差几天

    有段时间没写sql,正好今天要处理个比较复杂的业务问题,需要写sql,里面碰到几个小点,还有点记得不是太清楚,稍微想了一阵才写出来,特此记录,方便后续查询. 其中有一个环节,需要计算两个日期差几天,经 ...

  5. 【前端笔记】js计算两个日期差多少天

    只是粗略的计算,对差额的时分秒毫秒没有做更具体的处理,原理是通过时间戳计算两个时间点的毫秒差,再换算为天 方式1: (new Date('2021/04/22').getTime() - new Da ...

  6. java计算两个月份差_Java编程实现计算两个日期的月份差实例代码

    本文实例主要实现计算两个日期的月份差,具体如下: package com.forezp.util; import org.joda.time.DateTime; import org.joda.tim ...

  7. c++ 用 eigen与opencv计算两个向量的夹角,两个向量之间的夹角,向量的朝向

    计算两个向量的夹角,两个向量之间的夹角 eigen: #include "Eigen/Dense" #include "Eigen/Geometry" usin ...

  8. OpenCV计算两条平行线之间的距离

    代码来自www.opencvchina.com #include "cv.h" #include "highgui.h" #include "cxco ...

  9. opencv计算两数组的乘积_opencv矩阵运算(2)

    简单介绍 本篇承接上一篇.继续opencv下矩阵计算的函数使用. 计算矩阵的逆 注意:矩阵A是可逆矩阵的充分必要条件是行列式detA不等于0. 详细代码 double x[3][3] = {{1, 2 ...

  10. 使用OpenCV计算两幅图像的协方差

    要计算协方差首先要知道协方差的数学原理. 定义 Cov(X,Y) = E{ [X-E(X)][Y-E(Y)] }为随机量X与Y的协方差. 其中E(X)为随机变量X的期望(均值),E(Y)为随机变量Y的 ...

最新文章

  1. ORACLE---数据库巡检
  2. matlab如何创建table,MATLAB table数据结构 首篇
  3. 机器学习笔记的github镜像下载(github个人star数量排名175)
  4. x64版本的OpenGL库配置
  5. oracle错误1327,Oracle中的PGA监控报警分析(r11笔记第97天)
  6. Java课程笔记_3
  7. 一个mysql可以存多少数据类型_mysql一张表到底能存多少数据?
  8. 如何在vim中打印出^M
  9. 用户粘性︱如何提升用户忠诚度
  10. 17. 3D移动 transform:translateX(100px);transform:translateY(100px);transform:translateZ(100px);
  11. JAVA设计模式征服之路-00-设计模式简介
  12. 表格进阶03——简历制作(用表格布局)
  13. UnityShader入门精要-屏幕后处理效果 亮度饱和度对比度、边缘检测、高斯模糊、bloom效果、运动模糊
  14. linux用户自动输入密码,Linux自动输入密码登录用户
  15. 给 App 提速:Android 性能优化总结
  16. 6.数字图像处理及MATLAB实现-马赛克
  17. 敏捷开发:一文了解影响地图和用户故事地图之间的那些事儿
  18. 替换MP9486A 替代MP4689 替换LM5007 LM5017 国产芯片内置150V做降压恒压4.2V GPS防盗器专用芯片
  19. python自动发邮件报554错误_python smtplib使用163发送邮件 报错 554 DT:SPM
  20. 解决 {ret:100030,msg:this api without user authorization} android QQ第三发登录成功后获取用户信息失败的问题

热门文章

  1. 异构符号网络上的情感链接预测——SHINE
  2. 内网IP和外网IP的区别以及作用
  3. python回复qq消息,python自动化实现自动回复QQ消息
  4. HikariPool-1 - Connection is not available, request timed out after 6000ms
  5. Android KeyStore的使用
  6. php-java-net-python-刺绣添加厂商信息计算机毕业设计程序
  7. python中ascii函数_ascii函数
  8. mac DOSBox快捷键
  9. 跨境电商必看:amazon账号关联因素
  10. 遇到问题你的PIN不可用,请单击以重置和bitlocker恢复密匙