利用OpenCV实现图像的仿射变换

原创 2012年03月26日 09:21:16
利用OpenCV实现图像的仿射变换
仿射变换可以形象的表示成如下形式:一个平面内任意的平行四边形ABCD可以被仿射变换映射为另一个平行四边形A'B'C'D',如果四边形的面积不等于0,仿射变换就被这两个平行四边形(其中的三个顶点)唯一的定义,这里注意确定一个平行四边形只需要三个顶点。我们可以把仿射变换想象成把一幅图像画到一个胶板上,在胶板的角上推或拉以得到不同的平行四边形。
下面的程序实现了对图像的仿射变换,还包括图像旋转、缩放这两个重要的子集。

    #include <cv.h>
    #include <highgui.h>
    #include <stdio.h>
    #include <iostream.h>
    int main( int argc, char** argv )
    {
    CvPoint2D32f srcTri[3],dstTri[3];
    CvMat* rot_mat = cvCreateMat( 2, 3, CV_32FC1 );
    CvMat* warp_mat = cvCreateMat( 2, 3, CV_32FC1 );
    IplImage *src, *dst, *srcBak, *dstBak;
    int TLx = 0, TLy = 0, TRx = 0, TRy = 0, DLx = 0, DLy = 0;
    double angle = 40, scale = 0.8;
    float delta = 0.01;
    int PressKey;
    char name[1][80];
    if(!(src=cvLoadImage("C:/Users/jinxing/Desktop/Tests/test/Debug/lena.bmp",1)) )
    {
    printf("Input Error\n");
    return -1;
    }
    srcTri[0].x = 0;// Top left
    srcTri[0].y = 0;
    srcTri[1].x = src->width-1;//Top right
    srcTri[1].y = 0;
    srcTri[2].x = 0;//Down left
    srcTri[2].y = src->height-1;
    dst = cvCloneImage(src);
    srcBak = cvCloneImage(src);
    cvCopy(src,srcBak);
    dst->origin = src->origin;
    cvZero(dst);
    cvNamedWindow( "AffineTransform", 1 );
    CvFont font = cvFont( 1, 1 );
    while(1)
    {
    dstTri[0].x = srcBak->width*delta*(TLx%101);
    dstTri[0].y = srcBak->height*delta*(TLy%101);
    dstTri[1].x = srcBak->width-1 - srcBak->width*delta*(TRx%101);
    dstTri[1].y = srcBak->height*delta*(TRy%101);
    dstTri[2].x = srcBak->width*delta*(DLx%101);
    dstTri[2].y = srcBak->height-1 - srcBak->height*delta*(DLy%101);
    cvGetAffineTransform(srcTri,dstTri,warp_mat);
    cvWarpAffine(srcBak,dst,warp_mat);
    cvCopy(dst,src);
    CvPoint2D32f center = cvPoint2D32f(src->width/2,src->height/2);
    cv2DRotationMatrix(center,angle,scale,rot_mat);
    cvWarpAffine(src,dst,rot_mat);
    dstBak = cvCloneImage(dst);
    cvCopy(dst,dstBak);
    //--------------------------字符显示--------------------------------//
    char buf[8];
    char dspStr1[32] = {'|'};
    char dspStr2[32] = {'|'};
    char dspStr3[32] = {'|'};
    char dspStr4[32] = {'|'};
    memset(buf,'/0',sizeof(buf));
    strcat(dspStr1,itoa(TLx%101,buf,10));
    strcat(dspStr1,",");
    strcat(dspStr1,itoa(TLy%101,buf,10));
    strcat(dspStr1,"|TL");
    strcat(dspStr2,"angle=");
    strcat(dspStr2,itoa(int(angle),buf,10));
    strcat(dspStr2,",scale=");
    strcat(dspStr2,itoa(int(scale*100),buf,10));
    strcat(dspStr2,"%|");
    strcat(dspStr3,itoa(TRx%101,buf,10));
    strcat(dspStr3,",");
    strcat(dspStr3,itoa(TRy%101,buf,10));
    strcat(dspStr3,"|TR");
    strcat(dspStr4,itoa(DLx%101,buf,10));
    strcat(dspStr4,",");
    strcat(dspStr4,itoa(DLy%101,buf,10));
    strcat(dspStr4,"|DL");
    cvPutText(dst,dspStr1,cvPoint(dst->width-120,20),&font,cvScalar(0,0xff));
    cvPutText(dst,dspStr2,cvPoint(dst->width-180,80),&font,cvScalar(0,0xff));
    cvPutText(dst,dspStr3,cvPoint(dst->width-120,40),&font,cvScalar(0,0xff));
    cvPutText(dst,dspStr4,cvPoint(dst->width-120,60),&font,cvScalar(0,0xff));
    //---------------------------------------------------------------------//
    cvShowImage( "AffineTransform", dst );
    PressKey = cvWaitKey();
    printf("%c is pressed\n",PressKey);
    switch(PressKey)
    {
    case '1':
    TLx++;
    break;
    case 'q':
    TLx--;
    break;
    case '2':
    TLy++;
    break;
    case 'w':
    TLy--;
    break;
    case '3':
    TRx++;
    break;
    case 'e':
    TRx--;
    break;
    case '4':
    TRy++;
    break;
    case 'r':
    TRy--;
    break;
    case '5':
    DLx++;
    break;
    case 't':
    DLx--;
    break;
    case '6':
    DLy++;
    break;
    case 'y':
    DLy--;
    break;
    case '7':
    angle++;
    break;
    case 'u':
    angle--;
    break;
    case '8':
    scale+=0.01;
    break;
    case 'i':
    scale-=0.01;
    break;
    case 27:
    cvReleaseImage(&dst);
    cvDestroyWindow("AffineTransform");
    cvReleaseMat(&rot_mat);
    cvReleaseMat(&warp_mat);
    return 0;
    case 's':
    cout<<"Input the filename:"<<endl;
    cin>>name[0];
    cvSaveImage( name[0], dstBak );
    cout<<name[0]<<" is saved."<<endl;
    break;
    default:
    cout<<"Input Error."<<endl;
    cout<<"Input 1 2 3 4 5 6 7 8 q w e r t y to change the coordinate."<<endl<<
    "Input u and i to change the angle and scale."<<endl<<"Input s to save the image."<<endl
    <<"Input the esc to quit."<<endl;
    break;
    }
    }
    cvDestroyWindow("AffineTransform");
    cvReleaseImage(&dst);
    cvReleaseMat(&rot_mat);
    cvReleaseMat(&warp_mat);
    return 0;

    }

程序执行结果:



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

仿射变换OpenCV实现的最小二乘优化

仿射变换OpenCV实现的最小二乘优化 本函数只接受三个点的仿射变换,并不能处理样本点超过三个点、需要用最小二乘来找最接近的仿射变换的方式,所以笔者修改了本函数的实现,重新定义了一个如下:

仿射变换及OpenCV实现

仿射变换及OpenCV实现翻译自opencv官网,对原文有删改仿射变换是什么 可以用矩阵相乘或者向量叠加到矩阵表示的所有操作 所以可以用来做的操作有: – 旋转 – 平移(向量叠加) – 缩放 ...

OpenCv调整图像大小及仿射变换(旋转)

缩放: procedure TFrmMain.BtnResizeClick(Sender: TObject); var   pImg: PIplImage;   pDst: PIplImage...

图像的仿射变换与透视变换opencv

图像的仿射变换 两个向量空间之间的仿射变换(仿射映射)(Affine Transformation或Affine Map)是由一个线性变换接上一个平移组成。仿射变换可以理解为对坐标进行放缩、旋转、平移...

【OpenCV3图像处理】仿射变换 透视变换

图像处理的仿射变换和透视变换仿射变换和透视变换更直观的叫法可以叫做“平面变换”和“空间变换”。一个是二维坐标(x,y),一个是三维坐标(x,y,z)仿射变换:二维平面的变换 ; 线性变换 ;已知3对坐...

opencv-图像仿射变换

#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include #include u...

opencv-第六章-图像变换-重映射、仿射变换、透视变换

opencv-第六章-图像变换-重映射、仿射变换、透视变换

opencv实现图像傅里叶变换

  • 2014-06-05 11:15
  • 10.54MB
  • 下载

基于CUDA和OpenCV实现的图像GAMMA变换

一个很简单的CUDA程序,适合刚刚接触CUDA的人了解CUDA的工作原理,以及与OpenCV结合的基本用法。#include #include #include #include #include "...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)