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

来源:互联网 发布:数字域名网址 编辑:程序博客网 时间:2024/05/17 06:36

一、问题重述

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

二、实现结果

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> using namespace std; int main(){    IplImage* src1 = cvLoadImage("1.jpg");    IplImage* src2 = cvLoadImage("1.jpg");IplImage* src3 = cvLoadImage("1.jpg");cvFlip(src2, NULL,1);//获得左右镜面倒影cvFlip(src3, NULL,0);//获得上下镜面倒影    CvSize dstSize1;    dstSize1.width = src1->width *2.0;    dstSize1.height = src1->height;    IplImage* dst1 = cvCreateImage(dstSize1, src1->depth, src1->nChannels);cvZero(dst1);CvSize dstSize2;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");    return 0;}

四、关键函数分析

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

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

2.ResetImageROI 释放图像的ROI

void cvResetImageROI( IplImage* image );
image  图像头.
函数 cvResetImageROI 释放图像 ROI. 释放之后整个图像被认为是全部被选中的。相似的结果可以通过下述办法
cvSetImageROI( image, cvRect( 0, 0, image->width, image->height ));
cvSetImageCOI( image, 0 );
但是后者的变量不分配 image->roi.

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

typedef struct CvRect{int x; /* 方形的最左角的x-坐标 */int y; /* 方形的最上或者最下角的y-坐标 */int width; /* 宽 */int height; /* 高 */}
图片一般以左上角的点位原点,所以x,y设为x=0,y=0的话就表示左上角的定点。

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

void  cvFlip( const CvArr* src, CvArr* dst=NULL, int flip_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 

 
**************转载请注明出处**************

原创粉丝点击