您的位置:首页 > 编程语言 > C语言/C++

在OpenCV环境下写的两个图像平移C和C++源代码!

2016-05-14 14:34 483 查看
平像平移的概念就不用多说了,直接上经实测无误的代码吧!

源码一(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: