census算法的c++实现

这个代码是在(48条消息) 双目立体匹配 Census_MisTimee的博客-CSDN博客

基础上改的,添加了一些代码理解内容,由于本身对c++没有很熟悉(c++小白)所以代码的改进后不知道是不是更好,反正理解是更好理解了hhh。如果理解有错误的地方,麻烦在下方留言再改进。

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//先定义census对图像进行编码//
//首先定义一个窗口的大小
int hWind = 1;
//相当于利用窗口遍历整个图像,并且将8位的数字给每次窗口的中心点。
Mat ProcessImg(Mat& Img);
//定义一个左图像和右图像,还是在Mat类下面,这个是要用来分别获得将左右图像传递给ProcessImg后,得到的图像
Mat LeftCensus, RightCensus;
//通过下面这个类的成员函数获得视差图
Mat getDisparity(Mat& left, Mat& right);
//对视差图进行优化
Mat ProcessDisparity(Mat& disImg);
//先定义汉明距离//
int GetHammingWeight(uchar value);
//下面就是接受的返回值用自己定义的变量来接受
int ImgHeight, ImgWeight;Mat LeftImg, RightImg;
Mat DisparityImg(ImgHeight,ImgWeight,CV_8UC1,Scalar::all(0));
Mat DisparityImg_Processed(ImgHeight, ImgWeight, CV_8UC1, Scalar::all(0));int main()
{LeftImg = imread("E:/vs_qt_code/2.ppm", 0);//0是加载灰度图像//RightImg = imread("E:/vs_qt_code/3.ppm", 0);ImgHeight = LeftImg.rows;//获得行数也就是图像的高度//ImgWeight = LeftImg.cols;//获得列数//LeftCensus = ProcessImg(LeftImg);namedWindow("Left_census", 1);imshow("Left_census", LeftCensus);waitKey(500);RightCensus = ProcessImg(RightImg);namedWindow("Right_census", 1);imshow("Right_census", RightCensus);waitKey(500);DisparityImg = getDisparity(LeftCensus, RightCensus);namedWindow("Disparity", 1);imshow("Disparity", DisparityImg);//  imwrite(save_dir  + "disparity.jpg", DisparityImg);waitKey(500);DisparityImg_Processed = ProcessDisparity(DisparityImg);namedWindow("shichayouhua", 1);imshow("shichayouhua", DisparityImg_Processed);waitKey();return 0;
}
Mat ProcessImg(Mat& Img)
{Mat Img_census = Mat(Img.rows, Img.cols, CV_8UC1, Scalar::all(0));//创建一个单通道灰度图像,由于经过下面的操作每个中心点都变为census 序列也就是二进制的数串,uchar center = 0;for (int i = 0; i < ImgHeight - hWind-1; i++){for (int j = 0; j < ImgWeight - hWind-1; j++){center = Img.at<uchar>(i + hWind, j + hWind);//当遍历图像时获取每次的中心点,因为是3*3的矩阵这也是为什么要i < ImgHeight - hWind-1,j < ImgWeight - hWind-1uchar neighbor = 0;uchar census = 0;for (int p = i; p <= i + 2 * hWind; p++){for (int q = j; q <= j + 2 * hWind; q++){if (p >= 0 && p < ImgHeight && q >= 0 && q < ImgWeight){if (!(p == i + hWind && q == j + hWind)){neighbor = Img.at<uchar>(p, q);if (neighbor > center){census = census * 2;//这里*2的意思就是左移,这里应该是把大于的取为0,小于的取为1了,但是由于这样取最后hamming操作的结果是一样的}else{census = census * 2 + 1;}}}}}Img_census.at<uchar>(i + hWind, j + hWind) = census;//将census序列赋给每次便利的中心点}}return Img_census;
}
int GetHammingWeight(uchar value)
{int num = 0;if (value == 0)return 0;while(value){++num;value = (value - 1) & value;}return num;}
//用来获得视差图
Mat getDisparity(Mat& left, Mat& right)
{int DSR_min = 0;int DSR_max = 16;Mat disparity(ImgHeight, ImgWeight, CV_8UC1);Mat Dif(1, DSR_max - DSR_min, CV_8UC1);//定义一个1维的单通道矩阵for (int i = 0; i < ImgHeight; i++){for (int j = 0; j < ImgWeight; j++){uchar R;uchar L;uchar diff;int count = 0;L = left.at<uchar>(i, j);for (int k = DSR_min; k < DSR_max; k++){int y = j - k;//这里为什么用j-k,是因为左眼看到的视图会比右眼看到的偏右,因此以左眼为参考的话,确定右图的视差,则是要往左在0-16范围内寻找一样的点,由于往往是在一条线上的所以直接找不同位置的像素纵坐标就好。if (y < 0){Dif.at<uchar>(k) = 0;}if(y>=0){R = right.at<uchar>(i, y);//将右视图的这几个像素都取出来//diff = L ^ R;diff = GetHammingWeight(diff);Dif.at<uchar>(k) = diff;}}Point minLoc;minMaxLoc(Dif, NULL, NULL, &minLoc, NULL);int loc = minLoc.x;//这里的x指的是列 矩阵和坐标刚好相反disparity.at<uchar>(i, j) = (loc + 1) * 16 - 1;//这里就刚好改到0-255像素内}}return disparity;}
//视差优化 大白话就是将像素低于125的变为0,大于125的存储到ProcessDisImg
Mat ProcessDisparity(Mat& disImg)
{Mat ProcessDisImg(ImgHeight, ImgWeight, CV_8UC1); //用来存储图像的,里面的参数就是多大多高,单通道的灰度图像for (int i = 0; i < ImgHeight; i++){for (int j = 0; j < ImgWeight; j++){uchar pixel = disImg.at<uchar>(i, j);if (pixel < 100){pixel = 0;}ProcessDisImg.at<uchar>(i, j) = pixel;}}return ProcessDisImg;
}

大家可以留言改进。

Census算法的C++实现相关推荐

  1. 【老生谈算法】matlab实现census算法源码——census算法

    census算法matlab程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]census算法matlab程序.docx ...

  2. 立体匹配——census算法

    参考文章:https://blog.csdn.net/MyStylee/article/details/78491271 Census原理: 在视图中选取任一点,以该点为中心划出一个例如3 × 3的矩 ...

  3. 双目视觉07_立体匹配Census算法

    以下实验为左图 以下为实验右图 实验代码 import os import time import cv2 as cv import numpy as np import matplotlib.pyp ...

  4. 基于深度学习算法和传统立体匹配算法的双目立体视觉

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01 立体视觉是什么? 在开始之前,我相信很多站友都会有这个疑问, ...

  5. 双目立体匹配 Census

    上一篇介绍了双目立体匹配SAD算法,这一篇介绍Census算法. Census原理: 在视图中选取任一点,以该点为中心划出一个例如3 × 3 的矩形,矩形中除中心点之外的每一点都与中心点进行比较,灰度 ...

  6. 《一种新颖的自适应权重 Census变换立体匹配算法》(2016)

    摘要:针对当前 Census 变换立体匹配算法深度不连续区域匹配精度低的缺陷,提出了一种新颖的自适应权重的Census 变换立体匹配算法.在 Census 变换阶段计算变换窗口中心点上下左右四个像素的 ...

  7. 几种典型的立体匹配算法

    使用左右两张图片,计算深度图.一下几种算法代码参考 http://www.360doc.com/content/13/0129/11/11533449_263014896.shtml,经验证可行.并得 ...

  8. 【码上实战】【立体匹配系列】经典AD-Census: (3)代价计算

    海内存知己,天涯若比邻. 下载完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census 欢迎同学们在Github项目里讨论! 上篇主类中,我们对A ...

  9. 通过单细胞RNA-seq揭示TNBC中的亚克隆异质性和侵袭性疾病状态

    一.背景 三阴性乳腺癌(TNBC)是一种侵袭性亚型,其特点是广泛的瘤内异质性.三阴性乳腺癌在临床上被定义为缺乏雌激素受体(ER)和孕激素受体(PgR)表达以及人类表皮生长因子受体2(HER2)基因扩增 ...

最新文章

  1. Electron Built-in AutoUpdater 踩坑记录
  2. 在JAVA中使用MongoDB
  3. 在IIS上启用Gzip压缩 (HTTP压缩)方法
  4. Java虚拟机学习(2):垃圾收集算法
  5. 中国SaaS死或生之六:逢场作戏or脚踏实地?
  6. assert()用法
  7. 极大似然估计与贝叶斯定理
  8. 「CH2101」可达性统计 解题报告
  9. 【公益】开放一台Eureka注册中心给各位Spring Cloud爱好者
  10. 163邮箱:退信代码(对照表) - 说明篇
  11. Permutations
  12. vue+webpack+mint-ui 示例 (如何使用mint-ui组件)
  13. ICPC North Central NA Contest 2017 B - Pokemon Go Go
  14. 1.看板方法---解决敏捷管理者的困境
  15. 生成式对抗网络GAN汇总
  16. Xshell6和Xftp6 破解免安装版(亲测可用)
  17. 普林斯顿微积分读本篇二:三角学
  18. 【摸鱼吃瓜工作录】刚到公司,如何让项目经理对你刮目相看
  19. android帧动画卡顿现象,css3针对移动端卡顿问题的解决(动画性能优化)
  20. 32位程序运行内存1G以上容易卡死或崩溃问题

热门文章

  1. 基于scp的上传工具sscp
  2. 新书推荐 |《OpenCV 4计算机视觉项目实战(原书第2版)》
  3. 多径信道下的LMS、RLS均衡算法研究(二)
  4. 方方格子Excel工具箱的安装步骤教程
  5. [转载]如何设置U盘默认图标(个性化U盘图标)
  6. WCDMA关键技术详解(不定期更新)(转)
  7. xpath命令following-sibling用法
  8. html文档中用于表示页面标题的标记对是,汽车发动机拆装与检修实训超星尔雅答案...
  9. 盘点2012年微博十大丑闻
  10. 【OpenCV流程+代码分析】Opencv HOG行人检测 源码分析