利用红蓝分色原理制作三维图片与三维视频
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
imshow("frameVedio", VedioL);
if (waitKey(30) == 30){
isStop = true;
}//读取时间,遇到esc退出
}
else{
isStop = true;
} //播放完毕
}
outputvideo.release();
return 0;
}Baidu Nhomakorabea
四、
六组3d图片:
{
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);
技巧:
主要技巧在于拍摄,即用逆时针旋转5度的效果比较好,但旋转比较难以把握,很容易造成画面主体不在同一位置。所以我将相机显示网格线,将主体按三分法放在两条线的交汇处,即一个焦点,两次拍摄将主体放于同一焦点,保证物体在同一位置。此外,除第一张用手机拍摄外,其余均用单反拍摄,调至大光圈,拍摄单一光源下的单一物体,拍出大景深的效果,背景虚化,突出主体,效果更佳,例如图二。而3d视频的拍摄则将两个同一型号的手机叠放并将靠近自己那端的手机向外平移5cm露出摄像头,用手固定,并同时拍摄同一场景。
}
三维视频
#include <opencv\cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<iostream>
#include<cmath>
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];
CL.open(VedioLPath);//逐贞打开视频
CR.open(VedioRPath);
if (!CL.isOpened()){
cout << "无法打开1.mov文件\n";
waitKey(0);
}
if (!CR.isOpened()){
cout << "无法打开2.mp4文件\n";
waitKey(0);
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);//获取矩阵像素
}
//视频转换
bool isStop = false;
namedWindow("frameVedio", 1);
VideoWriter outputvideo;
outputvideo.open("3d.avi", 0, 24, Size(1920, 1080), true);//输出
while (!isStop){//判断视频文件结束
基于分色原理的三维图像的优缺点:
优点:技术难度低,成本低廉,拍摄方便,易于制作与合成。
缺点:3D画质效果不是很好,画面边缘易偏色,需要红蓝眼镜辅助才能达到3d效果。
目前3D电影院、3D液晶电视等大多采用的是偏光式3D技术,也叫偏振式3D技术,属于被动式3D技术,眼镜价格也较为便宜。和快门式3D技术一样,偏光式3D也细分出了很多种类,比如应用于投影机行业的偏光式3D需要两台以上性能参数完全相同的投影机才能实现3D效果,而应用于电视行业的偏光式3D技术则需要画面具有240Hz或者480Hz以上的刷新率。
三维视频:
利用拍摄图片的方法拍摄左眼视频与右眼视频,然后利用OpenCV读取左眼与右眼视频中的每一帧图像,利用上述方法合成三维图像,并利用OpenCV保存成.avi格式的视频。
难点:如何保持左眼视频与右眼视频在时间上的同步
三、
1.主模块设计
三维图片:
#include"iostream"
#include"cmath"
CL >> VedioL;//captureVedio.read(frameVedio);
CR >> VedioR;
if (VedioL.data&&VedioR.data){//循环获得视频文件的帧
VedioTransfer(VedioL, VedioR);
outputvideo << VedioL;
困难及解决方法:
代码方面,3d图片的代码比较简单,主要在于获取图片每个像素点的通道并进行转移,再将新图片输出显示。3d视频较复杂,主要在于需要用逐帧动画的方法来合成视频,即获取视频后,将视频按帧看做一张张图片,并用3d图片转换法转换每一张图片,即完成视频的转换,最后将视频保存并输出,输出大小为1920*1080。
第一组:
成品:
第二组:
成品:
第三组:
成品:
第四组:
成品:
第五组:
成品:
第六组:
成品:
五、心得与体会
效果:
3d图片的效果部分不是很明显,比如第一张和第三张,有很严重的重影。但第二张和第五张的效果比较好,尤其是第二张,几乎没有重影,能看到比较明显的3d效果。
3d视频的效果比较差,可能是拍摄的时候的角度和位置没有取好,而且画面的移动幅度过大,速度过快,观看时有一种晕眩的感觉,重影也比较严重。
3.利用红蓝眼镜观察立体效果是否明显,如果不明显,请重复1~2
难点:
在拍摄左眼图与右眼图时有技巧:由于人的两眼间存在一个不足5厘米的间距,因此在盯住同一景物时,两个眼球的角度并不相同。因此我们的拍摄也必须模拟这一原理,对同一景物拍摄两张照片,而且拍摄时需要略微变换一下拍摄角度(这个角度很小,约5~10度)。其次为了达到更好的合成效果,目标最好选择一些前背景比较分明的景物,如果能用单反拍摄出背景虚化的照片就更好。
实验二
一、
根据人眼三维视觉形成的原理,利用红蓝分色原理制作三维图片与三维视频。
二、
三维图像:
步骤:
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显示并保存合成后的图像
}
}
}
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";
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++)
我对于还处于研发阶段的裸眼式3d技术憧憬,待此技术成熟,即会迎来一个全新的时代,一个真3d时代。
if (waitKey(30) == 30){
isStop = true;
}//读取时间,遇到esc退出
}
else{
isStop = true;
} //播放完毕
}
outputvideo.release();
return 0;
}Baidu Nhomakorabea
四、
六组3d图片:
{
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);
技巧:
主要技巧在于拍摄,即用逆时针旋转5度的效果比较好,但旋转比较难以把握,很容易造成画面主体不在同一位置。所以我将相机显示网格线,将主体按三分法放在两条线的交汇处,即一个焦点,两次拍摄将主体放于同一焦点,保证物体在同一位置。此外,除第一张用手机拍摄外,其余均用单反拍摄,调至大光圈,拍摄单一光源下的单一物体,拍出大景深的效果,背景虚化,突出主体,效果更佳,例如图二。而3d视频的拍摄则将两个同一型号的手机叠放并将靠近自己那端的手机向外平移5cm露出摄像头,用手固定,并同时拍摄同一场景。
}
三维视频
#include <opencv\cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<iostream>
#include<cmath>
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];
CL.open(VedioLPath);//逐贞打开视频
CR.open(VedioRPath);
if (!CL.isOpened()){
cout << "无法打开1.mov文件\n";
waitKey(0);
}
if (!CR.isOpened()){
cout << "无法打开2.mp4文件\n";
waitKey(0);
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);//获取矩阵像素
}
//视频转换
bool isStop = false;
namedWindow("frameVedio", 1);
VideoWriter outputvideo;
outputvideo.open("3d.avi", 0, 24, Size(1920, 1080), true);//输出
while (!isStop){//判断视频文件结束
基于分色原理的三维图像的优缺点:
优点:技术难度低,成本低廉,拍摄方便,易于制作与合成。
缺点:3D画质效果不是很好,画面边缘易偏色,需要红蓝眼镜辅助才能达到3d效果。
目前3D电影院、3D液晶电视等大多采用的是偏光式3D技术,也叫偏振式3D技术,属于被动式3D技术,眼镜价格也较为便宜。和快门式3D技术一样,偏光式3D也细分出了很多种类,比如应用于投影机行业的偏光式3D需要两台以上性能参数完全相同的投影机才能实现3D效果,而应用于电视行业的偏光式3D技术则需要画面具有240Hz或者480Hz以上的刷新率。
三维视频:
利用拍摄图片的方法拍摄左眼视频与右眼视频,然后利用OpenCV读取左眼与右眼视频中的每一帧图像,利用上述方法合成三维图像,并利用OpenCV保存成.avi格式的视频。
难点:如何保持左眼视频与右眼视频在时间上的同步
三、
1.主模块设计
三维图片:
#include"iostream"
#include"cmath"
CL >> VedioL;//captureVedio.read(frameVedio);
CR >> VedioR;
if (VedioL.data&&VedioR.data){//循环获得视频文件的帧
VedioTransfer(VedioL, VedioR);
outputvideo << VedioL;
困难及解决方法:
代码方面,3d图片的代码比较简单,主要在于获取图片每个像素点的通道并进行转移,再将新图片输出显示。3d视频较复杂,主要在于需要用逐帧动画的方法来合成视频,即获取视频后,将视频按帧看做一张张图片,并用3d图片转换法转换每一张图片,即完成视频的转换,最后将视频保存并输出,输出大小为1920*1080。
第一组:
成品:
第二组:
成品:
第三组:
成品:
第四组:
成品:
第五组:
成品:
第六组:
成品:
五、心得与体会
效果:
3d图片的效果部分不是很明显,比如第一张和第三张,有很严重的重影。但第二张和第五张的效果比较好,尤其是第二张,几乎没有重影,能看到比较明显的3d效果。
3d视频的效果比较差,可能是拍摄的时候的角度和位置没有取好,而且画面的移动幅度过大,速度过快,观看时有一种晕眩的感觉,重影也比较严重。
3.利用红蓝眼镜观察立体效果是否明显,如果不明显,请重复1~2
难点:
在拍摄左眼图与右眼图时有技巧:由于人的两眼间存在一个不足5厘米的间距,因此在盯住同一景物时,两个眼球的角度并不相同。因此我们的拍摄也必须模拟这一原理,对同一景物拍摄两张照片,而且拍摄时需要略微变换一下拍摄角度(这个角度很小,约5~10度)。其次为了达到更好的合成效果,目标最好选择一些前背景比较分明的景物,如果能用单反拍摄出背景虚化的照片就更好。
实验二
一、
根据人眼三维视觉形成的原理,利用红蓝分色原理制作三维图片与三维视频。
二、
三维图像:
步骤:
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显示并保存合成后的图像
}
}
}
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";
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++)
我对于还处于研发阶段的裸眼式3d技术憧憬,待此技术成熟,即会迎来一个全新的时代,一个真3d时代。