利用红蓝分色原理制作三维图片及三维视频

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
uchar *p = left.ptr<uchar>(i);//获取像素
uchar *q = right.ptr<uchar>(i);
for (j = 0; j < left.cols; j++)
{
//左图BG通道转换为右图的BG通道,R通道不变
p[j * 3] = q[j * 3];
p[j * 3 + 1] = q[j * 3 + 1];
p[j * 3 + 2] = p[j * 3 + 2];
}
}
Mat img;
resize(left, img, Size(800, 600), 0, 0, CV_INTER_LINEAR);//固定输出图片大小
namedWindow("output");
imshow("output", img);
waitKey(0);
CL.open(VedioLPath);//逐贞打开视频
CR.open(VedioRPath);
if (!CL.isOpened()){
cout << "无法打开1.mov文件\n";
waitKey(0);
}
if (!CR.isOpened()){
cout << "无法打开2.mp4文件\n";
waitKey(0);
}
}
}
int main(int argc, char* argv[]){
Mat_<Vec3b> VedioL;
Mat_<Vec3b> VedioR;
VideoCapture CL;
VideoCapture CR;
const char* VedioLPath = "1.mov";//获取视频途径
const char* VedioRPath = "2.mp4";
}
三维视频
#include <opencv\cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<iostream>
#include<cmath>
imshow("frameVedio", VedioL);
if (waitKey(30) == 30){
isStop = true;
}//读取时间,遇到esc退出
}
else{
isStop = true;
} //播放完毕
}
outputvideo.release();
return 0;
}
四、
六组3d图片:
using namespace std;
using namespace cv;
int main()
{
Mat left = imread("211.jpg");//加载图片
Mat right = imread("212.jpg");
int i, j;
for (i = 0; i < left.rows; i++)
CL >> VedioL;//captureVedio.read(frameVedio);
CR >> VedioR;
if (VedioL.data&&VedioR.data){//循环获得视频文件的帧
VedioTransfer(VedioL, VedioR);
outputvideo << VedioL;
3.利用红蓝眼镜观察立体效果是否明显,如果不明显,请重复1~2
难点:
在拍摄左眼图与右眼图时有技巧:由于人的两眼间存在一个不足5厘米的间距,因此在盯住同一景物时,两个眼球的角度并不相同。因此我们的拍摄也必须模拟这一原理,对同一景物拍摄两张照片,而且拍摄时需要略微变换一下拍摄角度(这个角度很小,约5~10度)。其次为了达到更好的合成效果,目标最好选择一些前背景比较分明的景物,如果能用单反拍摄出背景虚化的照片就更好。
第Hale Waihona Puke Baidu组:
成品:
第二组:
成品:
第三组:
成品:
第四组:
成品:
第五组:
成品:
第六组:
成品:
五、心得与体会
效果:
3d图片的效果部分不是很明显,比如第一张和第三张,有很严重的重影。但第二张和第五张的效果比较好,尤其是第二张,几乎没有重影,能看到比较明显的3d效果。
uchar *dataRight = VedioR.ptr<uchar>(row);
for (int col = 0; col < VedioL.cols; col++){
dataLeft[col * 3] = dataRight[col * 3];//同理转换左视频BG通道
dataLeft[col * 3 + 1] = dataRight[col * 3 + 1];
三维视频:
利用拍摄图片的方法拍摄左眼视频与右眼视频,然后利用OpenCV读取左眼与右眼视频中的每一帧图像,利用上述方法合成三维图像,并利用OpenCV保存成.avi格式的视频。
难点:如何保持左眼视频与右眼视频在时间上的同步
三、
1.主模块设计
三维图片:
#include"iostream"
#include"cmath"
using namespace std;
using namespace cv;
//帧合并
void VedioTransfer(Mat_<Vec3b> &VedioL, Mat_<Vec3b> &VedioR){
for (int row = 0; row < VedioL.rows; row++){
uchar *dataLeft = VedioL.ptr<uchar>(row);//获取矩阵像素
实验二
一、
根据人眼三维视觉形成的原理,利用红蓝分色原理制作三维图片与三维视频。
二、
三维图像:
步骤:
1.利用手机/相机等摄像设备,拍摄大小相同的左眼图与右眼图
2.利用OpenCV读入左眼图与右眼图,假设左眼图像第i个像素颜色向量为(R1_i,G1_i,B1_i);右眼图像第i个像素颜色为(R2_i,G2_i,B2_i),则合成后的立体图像第i个像素为(R1_i,G2_i,B2_i);利用OpenCV显示并保存合成后的图像
}
//视频转换
bool isStop = false;
namedWindow("frameVedio", 1);
VideoWriter outputvideo;
outputvideo.open("3d.avi", 0, 24, Size(1920, 1080), true);//输出
while (!isStop){//判断视频文件结束
相关文档
最新文档