您的位置:首页 > 运维架构

用OpenCV实现图像的水平镜像(翻转)变换和竖直镜像(翻转)变换(垂直镜像变换)的源码

2016-05-18 11:51 1151 查看
直接上源码,本人是参考博文的源码/article/5704308.html改写而成的!

源码中用到的图像下载地址:http://pan.baidu.com/s/1bo5zC2F

首先是水平镜像变换的C源码(不使用MAT类)::

#include <opencv2/opencv.hpp>
#include <opencv2/legacy/compat.hpp>
#include <fstream>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

void mirror_horizontally_image(IplImage *src,IplImage *dst) //实现水平镜像变换
{
int M,N;
M=src->height;
N=src->width;

int i=0,j=0;

double temp1;

CvScalar s1;

for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
temp1 = cvGet2D(src,i,N-1-j).val[0];
s1.val[0]=temp1;
cvSet2D(dst,i,j,s1);

}
}

}

int main()
{

IplImage *pSrcImage = cvLoadImage("lena_gray.png", CV_LOAD_IMAGE_UNCHANGED);
IplImage *pOutImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U,1);

mirror_horizontally_image(pSrcImage,pOutImage);

const char *pstrWindowsATitle = "原图";
const char *pstrWindowsBTitle = "变换后的图";
//创建窗口
cvNamedWindow(pstrWindowsATitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsBTitle, CV_WINDOW_AUTOSIZE);
//在指定窗口中显示图像
cvShowImage(pstrWindowsATitle, pSrcImage);
cvShowImage(pstrWindowsBTitle, pOutImage);
//等待按键事件
cvWaitKey();
cvDestroyWindow(pstrWindowsATitle);
cvDestroyWindow(pstrWindowsBTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pOutImage);

return 0;
}


其次是竖直镜像变换的C源码(不使用MAT类)::

#include <opencv2/opencv.hpp>
#include <opencv2/legacy/compat.hpp>
#include <fstream>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

void mirror_vertically_image(IplImage *src,IplImage *dst) //实现竖直镜像变换
{
int M,N;
M=src->height;
N=src->width;

int i=0,j=0;

double temp1;

CvScalar s1;

for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
temp1 = cvGet2D(src,N-1-j,i).val[0];
s1.val[0]=temp1;
cvSet2D(dst,j,i,s1);

}
}

}

int main()
{

IplImage *pSrcImage = cvLoadImage("lena_gray.png", CV_LOAD_IMAGE_UNCHANGED);
IplImage *pOutImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U,1);

mirror_vertically_image(pSrcImage,pOutImage);

const char *pstrWindowsATitle = "原图";
const char *pstrWindowsBTitle = "变换后的图";
//创建窗口
cvNamedWindow(pstrWindowsATitle, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsBTitle, CV_WINDOW_AUTOSIZE);
//在指定窗口中显示图像
cvShowImage(pstrWindowsATitle, pSrcImage);
cvShowImage(pstrWindowsBTitle, pOutImage);
//等待按键事件
cvWaitKey();
cvDestroyWindow(pstrWindowsATitle);
cvDestroyWindow(pstrWindowsBTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pOutImage);

return 0;
}

运行结果如下图所示:





再次是水平翻转、垂直翻转、垂直和水平翻转的C++源码(使用MAT类)::

代码中用到的图像下载链接 http://pan.baidu.com/s/1dFv2MM9

//OpenCV版本2.4.9
//交流QQ2487872782

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main()
{
cv::Mat srcImage = cv::imread("pool.jpg");
if(!srcImage.data)
return -1;

// 水平翻转
cv::Mat resultImage2;
cv::flip(srcImage, resultImage2, 1);
// 垂直翻转
cv::Mat resultImage3;
cv::flip(srcImage, resultImage3, 0);
// 垂直和水平翻转
cv::Mat resultImage4;
cv::flip(srcImage, resultImage4, -1);

cv::imshow("srcImage", srcImage);
cv::imshow("水平翻转后的图像", resultImage2);
cv::imshow("垂直翻转后的图像", resultImage3);
cv::imshow("垂直和水平翻转后的图像", resultImage4);
cv::waitKey(0);
return 0;

}


运行结果如下图所示:



-------------------------------------------

欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号248787278
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: