您的位置:首页 > 编程语言

图像拼接实现镜面效果 opencv完整代码 实现(附实验结果)

2012-11-13 19:36 1486 查看
一、问题重述

对一张图片进行镜面处理,最后实现左右对称,上下对称。

二、实现结果

1.原图:



2.实现结果:左右对称



3.实现结果:上下对称



三、实例代码

运行环境:Windows7,OpenCV2.3,VS2010

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<fstream>
#include<string>
#include<iostream>
#include<opencv/cv.h>
#include<opencv/highgui.h>
usingnamespacestd;

intmain()
{
IplImage*src1=cvLoadImage("1.jpg");
IplImage*src2=cvLoadImage("1.jpg");
IplImage*src3=cvLoadImage("1.jpg");

cvFlip(src2,NULL,1);//获得左右镜面倒影
cvFlip(src3,NULL,0);//获得上下镜面倒影

CvSizedstSize1;
dstSize1.width=src1->width*2.0;
dstSize1.height=src1->height;
IplImage*dst1=cvCreateImage(dstSize1,src1->depth,src1->nChannels);
cvZero(dst1);

CvSizedstSize2;
dstSize2.width=src1->width;
dstSize2.height=src1->height*2.0;
IplImage*dst2=cvCreateImage(dstSize2,src1->depth,src1->nChannels);
cvZero(dst2);

//----------------------------------

//载入原图像到目标图像
cvSetImageROI(dst1,cvRect(0,0,src1->width,src1->height));
cvCopy(src1,dst1);
cvResetImageROI(dst1);

//载入左右镜面图像到目标图像
cvSetImageROI(dst1,cvRect(src1->width,0,src1->width,src1->height));
cvCopy(src2,dst1);
cvResetImageROI(dst1);

//---------------------------------------

//载入原图像到目标图像

cvSetImageROI(dst2,cvRect(0,0,src1->width,src1->height));
cvCopy(src1,dst2);
cvResetImageROI(dst2);

//载入上下镜面图像到目标图像

cvSetImageROI(dst2,cvRect(0,src1->height,src1->width,src1->height));
cvCopy(src3,dst2);
cvResetImageROI(dst2);

//---------------------------------------

cvNamedWindow("dst1");
cvShowImage("dst1",dst1);
cvSaveImage("right_left.jpg",dst1);

cvNamedWindow("dst2");
cvShowImage("dst2",dst2);
cvSaveImage("up_down.jpg",dst2);

cvWaitKey(0);

cvReleaseImage(&src1);
cvReleaseImage(&src2);
cvReleaseImage(&dst1);
cvReleaseImage(&dst2);

cvDestroyWindow("dst1");
cvDestroyWindow("dst2");

return0;
}


四、关键函数分析

1.SetImageROI 基于给定的矩形设置'感兴趣'区域(ROI:regionofinteresting)

voidcvSetImageROI(IplImage*image,CvRectrect);
image 图像.

rect ROI矩形.

函数cvSetImageROI基于给定的矩形设置图像的ROI(感兴趣区域).如果ROI是NULL并且参数RECT的值不等于整个图像,ROI被分配.不像COI,大多数的OpenCV函数支持ROI并且处理它就像它是一个分离的图像(例如,所有的像素坐标从ROI的左上角或左下角(基于图像的结构)计算。

2.ResetImageROI 释放图像的ROI

voidcvResetImageROI(IplImage*image);
image 图像头.

函数cvResetImageROI释放图像ROI.释放之后整个图像被认为是全部被选中的。相似的结果可以通过下述办法

cvSetImageROI(image,cvRect(0,0,image->width,image->height));

cvSetImageCOI(image,0);

但是后者的变量不分配image->roi.

3.cvRect 矩形框的偏移和大小 

typedefstructCvRect
{
intx;/*方形的最左角的x-坐标*/
inty;/*方形的最上或者最下角的y-坐标*/
intwidth;/*宽*/
intheight;/*高*/
}
图片一般以左上角的点位原点,所以x,y设为x=0,y=0的话就表示左上角的定点。

4.cvFlip 垂直,水平或即垂直又水平翻转二维数组

voidcvFlip(constCvArr*src,CvArr*dst=NULL,intflip_mode=0);
src 原数组.(原图像)

dst 目标责任制数组.如果dst=NULL翻转是在内部替换.

flip_mode 指定怎样去翻转数组。

flip_mode=0沿X-轴翻转,flip_mode>0(如1)沿Y-轴翻转,flip_mode<0(如-1)沿X-轴和Y-轴翻转.

函数主要使用在:

1)垂直翻转图像(flip_mode=0)用于顶-左和底-左图像结构的转换,主要用于WIN32系统下的视频操作处理;

2)水平图像转换,使用连续的水平转换和绝对值差检查垂直轴对称(flip_mode>0);

3)水平和垂直同时转换,用于连续的水平转换和绝对真理值差检查中心对称s(flip_mode<0);
4)翻转1维指针数组的顺序(flip_mode>0)。

五、引用链接

[1]http://www.opencv.org.cn/index.php/Cxcore%E6%95%B0%E7%BB%84%E6%93%8D%E4%BD%9C 

[2]http://whitebaby323.blog.163.com/blog/static/110427620112280837219/?suggestedreading 

**************转载请注明出处**************
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐