当前位置:首页 > 代码 > 正文

opencv生成视差代码(图像矫正 opencv)

admin 发布:2022-12-19 19:34 140


今天给各位分享opencv生成视差代码的知识,其中也会对图像矫正 opencv进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

OpenCV实现双目测距

原理很简单,利用了相似三角形计算距离,所以双目测距的主要任务在于前期摄像头的定标、双目图像点的特征匹配上。

摄像头定标一般都需要一个放在摄像头前的特制的标定参照物(棋盘纸),摄像头获取该物体的图像,并由此计算摄像头的内外参数。标定参照物上的每一个特征点相对于世界坐标系的位置在制作时应精确测定,世界坐标系可选为参照物的物体坐标系。在得到这些已知点在图像上的投影位置后,可计算出摄像头的内外参数。

如上公式所示,摄像头由于光学透镜的特性使得成像存在着径向畸变,可由三个参数k1,k2,k3确定;由于装配方面的误差,传感器与光学镜头之间并非完全平行,因此成像存在切向畸变,可由两个参数p1,p2确定。

cvStereoRectify 执行双目校正

initUndistortRectifyMap 分别生成两个图像校正所需的像素映射矩阵

cvremap 分别对两个图像进行校正

预处理: 图像归一化,减少亮度差别,增强纹理

stereoBM生成视差图

匹配过程: 滑动sad窗口,沿着水平线进行匹配搜索,由于校正后左右图片平行,左图的特征可以在右图对应行找到最佳匹配

再过滤: 去除坏的匹配点 通过uniquenessratio

输出视差图disparity:如果左右匹配点比较稠密,匹配点多,得到的图像与原图相似度比较大, 如果匹配点比较稀疏,得到的点与原图 相似度比较小

根据提取的特征点上用上述双目测距的相似三角算法得出距离。

请教大家,我想使用opencv2.2求视差,为什么包含cvaux.h头文件就编译出错。

你的cvaux应该是在opencv/cvaux.hpp目录下

而2.2的头文件是opencv2/opencv.hpp

opencv图像处理代码

显示图像代码

#include "StdAfx.h"

#include string

#include iostream

#include opencv2\core\core.hpp

#include opencv2\highgui\highgui.hpp

using namespace cv;

using namespace std;

int main()

{

string imageName = “lena.jpg”;

//读入图像

Mat img = imread(imageName, CV_LOAD_IMAGE_COLOR);

//如果读入图像失败

if (img.empty())

{

cout”Could not open or find the image!”endl;

return -1;

}

//创建窗口

namedWindow(“lena”, CV_WINDOW_AUTOSIZE);

//显示图像

imshow(“lena”, img);

//等待按键,按键盘任意键返回

waitKey();

return 0;

}

openCV进阶之二:自动校准扫描图像生成鸟瞰图

上一节介绍了如何openCV的透视转换方法的应用,并构建了一个基于给定四角点转换鸟瞰图的方法函数,这一节将继续这个运用,通过查找边缘的方法实现自动转换的功能。

实现步骤实际上很简单,只需要三步:

第一步:查找文档的边缘

第二步:通过边缘查找文档轮廓并找到四个角点的坐标

第三步:使用透视转换函数完成图像转换

下面的代码基于openCV/python的版本:openCV2.4/3+, python2.7/3+

上一章节我们完成了transform.py模块的构建,我们将在接下来的涉及图像四角点处理的问题中均会使用到。打开你的python编辑器,创建一个新的文档,并命名为scan.py。

接下来就是第一步:边缘查找:

测试一下效果:

shell

虽然背景有点不干净但是文档的边缘还是很明显的,接下来我们想办法查找文档的边缘并生成轮廓。

第二步:寻找轮廓:

事实上,在构建文档扫描器时,有一个非常重要的前提:扫描仪只是在一张纸上扫描。一张纸被假定为长方形,矩形有四条边。因此,我们可以创建一个简单的方法来帮助我们构建文档扫描器。我们假设图像中最大的轮廓恰好有四个点,这就是我们要扫描的那张纸。这也是一个相当安全的假设——当然,也可以人为的给定文档轮廓。

运行一下代码测试效果:shell中输入

正如您所看到的,我们已经成功地利用边缘检测图像找到了文档的轮廓(outline),我的收据周围的绿色矩形显示了轮廓(outline)。最后,让我们进入步骤3,这将是用到four_point_transform函数。

第三步:转换图像:构建移动文档扫描器的最后一步是取代表文档大纲的四个点,并应用透视图转换来获得自顶向下的图像“鸟瞰图”。

我们将把两个参数传递给four_point_transform:第一个参数是我们从磁盘加载的原始图像(不是调整大小的图像),第二个参数是表示文档的轮廓线,乘以调整大小的比例。

你可能会想,为什么要乘以调整后的比例? 我们乘以调整后的比例,因为我们进行了边缘检测,在调整后的高度=500像素的图像上发现了轮廓。但是,我们希望对原始图像进行扫描,而不是对调整大小的图像进行扫描,因此我们将轮廓点乘以调整大小的比例。

为了获得图像的黑白感觉,我们将扭曲后的图像转换为灰度图像,并应用自适应阈值。

好的,我们来运行一下效果:

shell

好了,到目前为止,扫描图像到文档提取鸟瞰图的过程实现完成了。遗留问题:

实际上这个程序还有不少地方需要你的改进,比如要求转换的文档本身是规则的四边形,拍摄时尽量放在对比度明显的桌面背景,这样做的目的是为了避免边缘查找时出现多于四边的情况,多于四边的边缘后续轮廓查找会出现问题。也就是找不到合适的四边轮廓来匹配。

解决方案:可以采用人工标注四个角点的方式来提取轮廓更为可靠。因为在实际应用场景往往是不规则的文档。下一节我们来探讨这个方案实现过程。

如何将opencv的处理结果嬗蒻atlab分析

由于OpenCV本身只支持 xml、yml 的数据文件读写功能,并且其xml文件与构建网页数据所用的xml文件格式不一致,在Matlab中无法读取。我们可以通过以下方式将视差数据保存为txt文件,再导入到Matlab中。

void saveDisp(const char* filename, const Mat mat)

{

FILE* fp = fopen(filename, "wt");

fprintf(fp, "d/n", mat.rows);

fprintf(fp, "d/n", mat.cols);

for(int y = 0; y mat.rows; y++)

{

for(int x = 0; x mat.cols; x++)

{

short disp = mat.at(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;

% 使坐标轴显示范围与数据范围相贴合,去除空白显示区

opencv生成视差代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于图像矫正 opencv、opencv生成视差代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/20745.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载