Census算法的C++实现
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++实现相关推荐
- 【老生谈算法】matlab实现census算法源码——census算法
census算法matlab程序 1.文档下载: 本算法已经整理成文档如下,有需要的朋友可以点击进行下载 序号 文档(点击下载) 本项目文档 [老生谈算法]census算法matlab程序.docx ...
- 立体匹配——census算法
参考文章:https://blog.csdn.net/MyStylee/article/details/78491271 Census原理: 在视图中选取任一点,以该点为中心划出一个例如3 × 3的矩 ...
- 双目视觉07_立体匹配Census算法
以下实验为左图 以下为实验右图 实验代码 import os import time import cv2 as cv import numpy as np import matplotlib.pyp ...
- 基于深度学习算法和传统立体匹配算法的双目立体视觉
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01 立体视觉是什么? 在开始之前,我相信很多站友都会有这个疑问, ...
- 双目立体匹配 Census
上一篇介绍了双目立体匹配SAD算法,这一篇介绍Census算法. Census原理: 在视图中选取任一点,以该点为中心划出一个例如3 × 3 的矩形,矩形中除中心点之外的每一点都与中心点进行比较,灰度 ...
- 《一种新颖的自适应权重 Census变换立体匹配算法》(2016)
摘要:针对当前 Census 变换立体匹配算法深度不连续区域匹配精度低的缺陷,提出了一种新颖的自适应权重的Census 变换立体匹配算法.在 Census 变换阶段计算变换窗口中心点上下左右四个像素的 ...
- 几种典型的立体匹配算法
使用左右两张图片,计算深度图.一下几种算法代码参考 http://www.360doc.com/content/13/0129/11/11533449_263014896.shtml,经验证可行.并得 ...
- 【码上实战】【立体匹配系列】经典AD-Census: (3)代价计算
海内存知己,天涯若比邻. 下载完整源码,点击进入: https://github.com/ethan-li-coding/AD-Census 欢迎同学们在Github项目里讨论! 上篇主类中,我们对A ...
- 通过单细胞RNA-seq揭示TNBC中的亚克隆异质性和侵袭性疾病状态
一.背景 三阴性乳腺癌(TNBC)是一种侵袭性亚型,其特点是广泛的瘤内异质性.三阴性乳腺癌在临床上被定义为缺乏雌激素受体(ER)和孕激素受体(PgR)表达以及人类表皮生长因子受体2(HER2)基因扩增 ...
最新文章
- Electron Built-in AutoUpdater 踩坑记录
- 在JAVA中使用MongoDB
- 在IIS上启用Gzip压缩 (HTTP压缩)方法
- Java虚拟机学习(2):垃圾收集算法
- 中国SaaS死或生之六:逢场作戏or脚踏实地?
- assert()用法
- 极大似然估计与贝叶斯定理
- 「CH2101」可达性统计 解题报告
- 【公益】开放一台Eureka注册中心给各位Spring Cloud爱好者
- 163邮箱:退信代码(对照表) - 说明篇
- Permutations
- vue+webpack+mint-ui 示例 (如何使用mint-ui组件)
- ICPC North Central NA Contest 2017 B - Pokemon Go Go
- 1.看板方法---解决敏捷管理者的困境
- 生成式对抗网络GAN汇总
- Xshell6和Xftp6 破解免安装版(亲测可用)
- 普林斯顿微积分读本篇二:三角学
- 【摸鱼吃瓜工作录】刚到公司,如何让项目经理对你刮目相看
- android帧动画卡顿现象,css3针对移动端卡顿问题的解决(动画性能优化)
- 32位程序运行内存1G以上容易卡死或崩溃问题
热门文章
- 基于scp的上传工具sscp
- 新书推荐 |《OpenCV 4计算机视觉项目实战(原书第2版)》
- 多径信道下的LMS、RLS均衡算法研究(二)
- 方方格子Excel工具箱的安装步骤教程
- [转载]如何设置U盘默认图标(个性化U盘图标)
- WCDMA关键技术详解(不定期更新)(转)
- xpath命令following-sibling用法
- html文档中用于表示页面标题的标记对是,汽车发动机拆装与检修实训超星尔雅答案...
- 盘点2012年微博十大丑闻
- 【OpenCV流程+代码分析】Opencv HOG行人检测 源码分析