图像的旋转加缩放(效果很拽,用地球做就像谷歌地球似的)
#include \
#include \#include \
int main( int argc, char** argv ) {
IplImage* src;
/* the first command line parameter must be image file name */ if( argc==2 && (src = cvLoadImage(argv[1], -1))!=0) {
IplImage* dst = cvCloneImage( src ); int delta = 1; int angle = 0;
int opt = 1; // 1: 旋转加缩放 // 0: 仅仅旋转 double factor;
cvNamedWindow( \ cvShowImage( \
for(;;) {
float m[6];
// Matrix m looks like: //
// [ m0 m1 m2 ] ===> [ A11 A12 b1 ] // [ m3 m4 m5 ] [ A21 A22 b2 ] //
CvMat M = cvMat( 2, 3, CV_32F, m ); int w = src->width; int h = src->height; if(opt) // 旋转加缩放
factor = (cos(angle*CV_PI/180.) + 1.05)*2; else // 仅仅旋转 factor = 1;
m[0] = (float)(factor*cos(-angle*2*CV_PI/180.)); m[1] = (float)(factor*sin(-angle*2*CV_PI/180.)); m[3] = -m[1]; m[4] = m[0];
// 将旋转中心移至图像中间 m[2] = w*0.5f; m[5] = h*0.5f;
// dst(x,y) = A * src(x,y) + b
cvGetQuadrangleSubPix( src, dst, &M);//提取象素四边形,使用子象素精度
cvNamedWindow( \ cvShowImage( \ if( cvWaitKey(5) == 27 ) break;
angle =(int) (angle + delta) % 360; } // for-loop }
return 0; }
Log-Polar极坐标变换
原始图:
效果图:(正变换)
反变换:
正反变换只是函数中一个参数的不同,具体看你所需要的应用。
cvLogPolar函数可以用来模拟人类的中央视觉(foveal vision),并可以用于物体跟踪方面的尺度及旋转不变模板的快速匹配。 源代码:
#include
#include
int main(int argc, char** argv) {
IplImage* src;
if( argc == 2 && (src=cvLoadImage(argv[1],1)) != 0 ) {
IplImage* dst = cvCreateImage( cvSize(256,256), 8, 3 ); IplImage* src2 = cvCreateImage( cvGetSize(src), 8, 3 );
cvLogPolar( src, dst, cvPoint2D32f(src->width/2,src->height/2), 40, CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS ); cvLogPolar( dst, src2,
cvPoint2D32f(src->width/2,src->height/2), 40,
CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS+CV_WARP_INVERSE_MAP ); cvNamedWindow( \ cvShowImage( \
cvNamedWindow( \ cvShowImage( \ cvWaitKey(); }
return 0; }
对图像进行形态学操作(图像的开闭,腐蚀和膨胀运算)
效果图:(什么东东长这么丑啊,汗)
#include
#include
IplConvKernel* element = 0;
int element_shape = CV_SHAPE_RECT;
//the address of variable which receives trackbar position update int max_iters = 10;
int open_close_pos = 0; int erode_dilate_pos = 0;
// callback function for open/close trackbar void OpenClose(int pos) {
int n = open_close_pos - max_iters; int an = n > 0 ? n : -n;
element = cvCreateStructuringElementEx( an*2+1, an*2+1, an, an, element_shape, 0 ); if( n < 0 ) {
cvErode(src,dst,element,1); cvDilate(dst,dst,element,1); }