资源简介
这是基于opencv的计算机视觉技术书中的一个程序实例,本人觉得很不错,学习三维立体重建的朋友们可以看看啊
代码片段和文件信息
#include “cv.h“
#include “cxcore.h“
#include “highgui.h“
#include
#include
#include
#include
using namespace std;
#define IMAGE_HEIGHT 288
#define IMAGE_WIDTH 384
#define SIZE 19
//计算基础矩阵
void find_F(double F_data[3][3]double M1_data[3][4]double M2_data[3][4])
{
CvMat F = cvMat(33CV_64FC1F_data);
double M11_data[3][3]={0.00.00.00.00.00.00.00.00.0};
double M21_data[3][3]={0.00.00.00.00.00.00.00.00.0};
double mx_data[3][3]={0.00.00.00.00.00.00.00.00.0};
double m1_data[3]={0.00.00.0};
double m2_data[3]={0.00.00.0};
double m_data[3]={0.00.00.0};
CvMat M11 = cvMat(33CV_64FC1M11_data);
CvMat M21 = cvMat(33CV_64FC1M21_data);
CvMat mx = cvMat(33CV_64FC1mx_data);
CvMat m1 = cvMat(31CV_64FC1m1_data);
CvMat m2 = cvMat(31CV_64FC1m2_data);
CvMat m = cvMat(31CV_64FC1m_data);
int ij;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
M11_data[i][j]=M1_data[i][j];//修改过
M21_data[i][j]=M2_data[i][j];//修改过
}
m1_data[i]=M1_data[i][3];
m2_data[i]=M2_data[i][3];
}
cvInvert(&M11&M11);
cvMatMul(&M21&M11&M21);
cvMatMul(&M21&m1&m1);
for(i=0;i<3;i++)
{
m1_data[i]=-m1_data[i];
}
cvAdd(&m2&m1&m);
mx_data[0][1]=-m_data[2];
mx_data[0][2]=m_data[1];
mx_data[1][0]=m_data[2];
mx_data[1][2]=-m_data[0];
mx_data[2][0]=-m_data[1];
mx_data[2][1]=m_data[0];
cvMatMul(&mx&M21&F);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
cout< }
cout< }
cout< }
//点匹配
bool match(double point_src[2]double point_dst[2]IplImage* img_srcIplImage* img_dstdouble F_matrix[3][3]double colors[3]IplImage* img_temp)
{
if(point_src[0]<=SIZE/2||point_src[1]<=SIZE/2||point_src[0]>=IMAGE_WIDTH-SIZE/2||point_src[1]>=IMAGE_HEIGHT-SIZE/2)
{
return false;
}
double point1_data[3]={point_src[0]point_src[1]1.0};
CvMat point1 = cvMat(31CV_64FC1point1_data);
double line_data[3]={0.00.00.0};
CvMat line = cvMat(31CV_64FC1line_data);
CvMat F = cvMat(33CV_64FC1F_matrix);
//计算极线方程
cvMatMul(&F&point1&line);
double cos_value = -1;
double temp_cos = -1;
//建立向量源
double vec_src[SIZE*SIZE*3];
int num=0;
for(int i=-SIZE/2;i<=SIZE/2;i++)
{
for(int j=-SIZE/2;j<=SIZE/2;j++)
{
uchar* temp = &((uchar*)(img_src->imageData+img_src->widthStep*((int)point1_data[1]+i)))[((int)point1_data[0]+j)*3];
vec_src[num++]=temp[0];//blue
vec_src[num++]=temp[1];//green
vec_src[num++]=temp[2];//red
}
}
//遍历极线
double dxdy;
double x = -line_data[2]/line_data[0]y=-line_data[2]/line_data[1];
if(fabs(line_data[0])<0.001)
{
x = SIZE/2+1;
dx = 1.0;
dy = 0.0;
}
else if(fabs(line_data[1])<0.001)
{
y = SIZE/2+1;
dx=0.0;
dy=1.0;
}
else if(fabs(line_data[0]/line_data[1])<1.0)
{
x = SIZE/2+1;
y = (-line_data[2]-x*line_data[0])/line_data[1];
dx = 1.0;
dy = -line_data[0]/line_data[1];
while(x<=S
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 445 2012-04-08 17:45 三维重建\function_source.h
文件 6310 2012-04-09 22:15 三维重建\reconstruction_source.cpp
文件 6552 2012-04-08 17:46 三维重建\function_source.cpp
目录 0 2012-04-09 23:14 三维重建
----------- --------- ---------- ----- ----
13307 4
- 上一篇:中间代码生成四元式设计
- 下一篇:高斯扩散模型
相关资源
- 建模题目---血管的三维重建
- 2.4.9版本的opencv_createsamples.exe和openc
- opencv.props
- opencv数字识别
- OpenCV人脸识别训练集
- 三维重建算法原理的书籍
- 图像的载入显示和输出程序by浅墨
- 基于视频的运动目标检测
- OpenCV计算图像灰度均值
-
用于Opencv的车牌识别xm
l文件 - opencv3.4.1人脸识别小程序
- OpenCV截取图像的任意区域(ROI)规则
- Opencv灰度变化
- OpenCVForUnity2.2.4
- TensorFlow实现人脸识别(1)------Linux下
- 多基线立体匹配技术的三维重建
- OpenCV中值滤波源代码
- 基于OpenCV的车牌定位
- opencv 头文件以及库文件
- 运动人体的摔倒检测
- Opencv行人检测代码 自带hog检测
- opencv读取usb摄像头和播放视频
- ARM上利用opencv实现人脸识别
- opencv_contrib xfeatures2d boostdesc
- Linux上Qt-OpenCV采集摄像头视频并显示
- OpenCV利用Qt的GUI显示图片
- 基于OpenCV3.2+Qt5.8的basler相机硬件触发
- 基于Opencv的图像分类
- 基于opencv + 多线程的目标跟踪
- 基于OpenCV的多种条形码识别算法
评论
共有 条评论