在OpenCV环境下写的两个图像平移C和C++源代码!
来源:互联网 发布:暗黑三数据库 编辑:程序博客网 时间:2024/05/30 05:00
平像平移的概念就不用多说了,直接上经实测无误的代码吧!
源码一(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
0 0
- 在OpenCV环境下写的两个图像平移C和C++源代码!
- 在OpenCV环境下写的灰度图像二维傅里叶换,幅值计算,频谱平移和将数值归一化到0到255区间的四个函数
- 在MATLAB和OpenCV环境下写的灰度图像分段线性变换源码!
- OpenCV在图像上抠取指定区域平移、缩放的图像
- C语言在VS2017环境下写俄罗斯方块的感悟
- OpenCV编程->图像的平移
- 在OpenCV环境下进行图像的直方图均衡化
- 在OpenCV环境下做图像或矩阵的傅里叶变换
- C语言实现bmp图像的平移操作
- 在linux环境下 编译opencv (C++)工程
- opencv(c++)OpenCV添加(混合)两个图像
- MATLAB实现图像平移的源代码!
- c语言写的源代码
- OpenCV编程->二维图像的平移warpAffine
- 【opencv+C++】在图像中找四边形
- 【opencv+C++】在图像中找四边形
- 图像的平移和缩放
- opencv实现图像平移
- 学生信息管理系统--常见问题
- 混用ngui和ugui渲染顺序问题
- CoreOS的适应场景介绍
- 重写virtual时不写关键字会发生什么
- HZAU 1001 Handing Out Candies
- 在OpenCV环境下写的两个图像平移C和C++源代码!
- android之SurfaceView
- java运行原理
- 大话设计模式-享元模式
- Java泛型基础
- 修改log4j配置文件来减小Linux系统tomcat/logs目录下的catalina.out文件的大小
- bzoj2132 圈地计划
- 关于gedit的一个小问题
- 242. Valid Anagram