用OpenCV实现图像的水平镜像(翻转)变换和竖直镜像(翻转)变换(垂直镜像变换)的源码
2016-05-18 11:51
1151 查看
直接上源码,本人是参考博文的源码/article/5704308.html改写而成的!
源码中用到的图像下载地址:http://pan.baidu.com/s/1bo5zC2F
首先是水平镜像变换的C源码(不使用MAT类)::
其次是竖直镜像变换的C源码(不使用MAT类)::
运行结果如下图所示:
再次是水平翻转、垂直翻转、垂直和水平翻转的C++源码(使用MAT类)::
代码中用到的图像下载链接 http://pan.baidu.com/s/1dFv2MM9
运行结果如下图所示:
-------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号248787278
源码中用到的图像下载地址: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
相关文章推荐
- Nginx做网站缓存
- linux 网站架设调优Apache(三)
- 学习网站
- Open-E DSS V7 应用系列之六 构建软件iSCSI
- Open-E DSS V7 应用系列之六 构建软件iSCSI
- 前端交互开发微体验--总结了一些国内外炫酷的网站
- 克隆虚拟机系统(linux)
- 好的架构师,挖空心思偷懒
- linux下的path和classpth
- tomcat强制关闭
- linux下chmod
- linux 网站架设调优Apache(二)
- linux 后台执行scp
- Linux下C语言实现LCD屏幕截图
- linux 网站架设调优Apache(一)
- linux进程间通信
- nginx 直接在配置文章中设置日志分割
- PopupWindow的使用、位置控制
- 查看进程linux命令
- nanoi gpio驱动分析1 exportGPIOPin