图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601
本文参考博文 https://www.cnblogs.com/wangguchangqing/p/4039095.html
本文向大家提供三个源码,分别为:
①基于OpenCV1.x写的水平镜像变换C源码
②基于OpenCV1.x写的竖直镜像变换C源码
③基于OpenCV2.x写的包含水平翻转、垂直翻转、同时进行垂直和水平翻转的C++源码。
①基于OpenCV1.x写的水平镜像变换C源码(不使用MAT类)::
源码中用到的图像下载链接:https://pan.baidu.com/s/1bo5zC2F
#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;
}
②基于OpenCV1.x写的竖直镜像变换C源码(不使用MAT类):
源码中用到的图像下载链接:https://pan.baidu.com/s/1bo5zC2F
#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;
}
运行结果如下图所示:
③基于OpenCV2.x写的包含水平翻转、垂直翻转、同时进行垂直和水平翻转的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;
}
运行结果如下图所示:
图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601