在OpenCV环境下写的两个图像平移C和C++源代码!
2016-05-14 14:34
483 查看
平像平移的概念就不用多说了,直接上经实测无误的代码吧!
源码一(C编程,不用MAT类)
上面的源码会改变图像的大小的源码,如果想写不改变图像大小的平移源码,可以参考 http://www.cnblogs.com/wangguchangqing/p/4039095.html 中的源码进行相应代码的修改!比如就借鉴链接中的思路去改我此博文中的源码也可以啊!
源码二(C++编程,用MAT类)
程序中用到的图像的下载链接如下:http://pan.baidu.com/s/1dFv2MM9
运行结果如下图所示
-------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号2487872782
源码一(C编程,不用MAT类)
#include <opencv2/opencv.hpp> #include <opencv2/legacy/compat.hpp> #include <fstream> using namespace std; #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"") //该函数的功能是实现图像的平移 //规定向下、向右为(正,正) IplImage *moveImage(IplImage *src,int h0,int w0) { int h=h0; int w=w0; int imageHeight=src->height; int imageWidth=src->width; int i,j; CvScalar sTemp; IplImage *dst=cvCloneImage(src); cvSetZero(dst); if (h>=0 && w>=0) { // for (i=0;i<imageHeight-h;i++) { for (j=0;j<imageWidth-w;j++) { sTemp=cvGet2D(src,i,j); cvSet2D(dst,i+h,j+w,sTemp); } } } else if (h<0 && w>=0) { for (i=-h;i<imageHeight;i++) { for (j=0;j<imageWidth-w;j++) { sTemp=cvGet2D(src,i,j); cvSet2D(dst,i+h,j+w,sTemp); } } } else if (h>=0 && w<0) { // for (i=0;i<imageHeight-h;i++) { for (j=-w;j<imageWidth;j++) { sTemp=cvGet2D(src,i,j); cvSet2D(dst,i+h,j+w,sTemp); } } } else if (h<0 && w<0) { for (i=-h;i<imageHeight;i++) { for (j=-w;j<imageWidth;j++) { sTemp=cvGet2D(src,i,j); cvSet2D(dst,i+h,j+w,sTemp); } } } else { printf("cannot move!"); dst=cvCloneImage(src); } return dst; } int main(void) { IplImage* pImg; //声明IplImage指针 IplImage* pImgAfterMove; pImg=cvLoadImage("lena.jpg"); pImgAfterMove=cvCloneImage(pImg); cvSetZero(pImgAfterMove); pImgAfterMove=moveImage(pImg,100,-100); cvNamedWindow("原图像",CV_WINDOW_AUTOSIZE); cvShowImage("原图像",pImg ); cvNamedWindow("平移之后的图像",CV_WINDOW_AUTOSIZE); cvShowImage("平移之后的图像",pImgAfterMove); cvWaitKey(0); //等待按键 cvDestroyWindow( "原图像" );//销毁窗口 cvDestroyWindow( "平移之后的图像" ); cvReleaseImage( &pImg ); //释放图像 cvReleaseImage( &pImgAfterMove ); return 0; }程序运行结果如下图所示:
上面的源码会改变图像的大小的源码,如果想写不改变图像大小的平移源码,可以参考 http://www.cnblogs.com/wangguchangqing/p/4039095.html 中的源码进行相应代码的修改!比如就借鉴链接中的思路去改我此博文中的源码也可以啊!
源码二(C++编程,用MAT类)
程序中用到的图像的下载链接如下:http://pan.baidu.com/s/1dFv2MM9
//OpenCV版本2.4.9 //交流QQ2487872782 #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> // 平移操作 图像大小不变 cv::Mat imageTranslation1(cv::Mat & srcImage, int xOffset, int yOffset) { int nRows = srcImage.rows; int nCols = srcImage.cols; cv::Mat resultImage(srcImage.size(), srcImage.type()); // 遍历图像 for (int i = 0; i < nRows; ++i) { for (int j = 0; j < nCols; ++j) { // 映射变换 int x = j - xOffset; int y = i - yOffset; // 边界判断 if (x >= 0 && y >= 0 && x < nCols && y < nRows) resultImage.at<cv::Vec3b>(i,j) = srcImage.ptr<cv::Vec3b>(y)[x]; } } return resultImage; } // 平移操作 图像大小改变 cv::Mat imageTranslation2(cv::Mat & srcImage, int xOffset, int yOffset) { // 设置平移尺寸 int nRows = srcImage.rows + abs(yOffset); int nCols = srcImage.cols + abs(xOffset); cv::Mat resultImage(nRows, nCols, srcImage.type()); for (int i = 0; i < nRows; ++i) { for (int j = 0; j < nCols; ++j) { // 映射变换 int x = j - xOffset; int y = i - yOffset; // 边界判断 if (x >= 0 && y >= 0 && x < nCols && y < nRows) resultImage.at<cv::Vec3b>(i,j) = srcImage.ptr<cv::Vec3b>(y)[x]; } } return resultImage; } int main() { cv::Mat srcImage = cv::imread("pool.jpg"); if(!srcImage.data) return -1; cv::imshow("原图像", srcImage); int xOffset = 50, yOffset = 80; // 图像右下平移不改变大小 cv::Mat resultImage1 = imageTranslation1(srcImage, xOffset, yOffset); cv::imshow("图像右下平移不改变大小", resultImage1); // 图像右下平移并自动增加尺寸 cv::Mat resultImage2 = imageTranslation2(srcImage, xOffset, yOffset); cv::imshow("图像右下平移并自动增加尺寸", resultImage2); // 图像左上平移不改变大小 xOffset = -50, yOffset = -80; cv::Mat resultImage3 = imageTranslation1(srcImage, xOffset, yOffset); cv::imshow("图像左上平移不改变大小", resultImage3); cv::waitKey(0); return 0; }
运行结果如下图所示
-------------------------------------------
欢迎大家加入图像识别技术交流群:271891601,另外,特别欢迎成都从事图像识别工作的朋友交流,我的QQ号2487872782
相关文章推荐
- 嵌入式C语言实例(达内2013)
- more effective c++ item26 控制对象的数量
- C++编译时多态之运算符重载
- C++中字节的长度
- ## c++学习笔记 --基础篇(第一周)##
- C++ 第二次课堂作业(反转链表)
- C++ 第二次课堂作业(反转链表)
- C/C++ 关于大小端模式
- C++实现“简单计算器”
- C语言_左移(<<)和右移(>>)
- c/c++ 参数传递 - 数组
- Oxford building dataset数据集计算正确相关图像ground truth的C++代码
- C++ 传递对象---用值传递对象
- 1.C++学习笔记:内存模型
- [容器]STL之set容器详解
- C++日记——浅谈继承
- C++名称空间
- c++文件的读取
- 如何成为一名高级C++程序员
- 【LeetCode】290. Word Pattern