在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
原创粉丝点击