1 #include"cv.h" 2 #include"highgui.h" 3 using namespace cv; 4 void CVFILTER2D(IplImage * img, IplImage *dst); 5 void CVCOPYMAKEBORDER(IplImage *ori, IplImage *dst); 6 void CVSOBEL(IplImage * img, IplImage *dst); 7 void CVLAPLACE(IplImage *img, IplImage *dst); 8 void CVCANNY(IplImage *img); 9 void CVHOUGHCIRCLES(IplImage *img); 10 void CVINVERT(IplImage *img); 11 void CVCHANGE(IplImage *img); 12 int main() 13 { 14 IplImage *fromimg = cvLoadImage("e:/picture/Wife2.jpg"); 15 IplImage *getimg = cvCreateImage(cvSize(400,600),fromimg->depth,fromimg->nChannels); 16 cvResize(fromimg,getimg); 17 //IplImage *dest = cvCreateImage(cvSize(getimg->width+1,getimg->height+1),getimg->depth,getimg->nChannels);//for cvCopyMakeBorder() 18 IplImage *dest = cvCreateImage(cvSize(getimg->width, getimg->height), getimg->depth, getimg->nChannels); 19 CVFILTER2D(getimg,dest); 20 //CVCOPYMAKEBORDER(getimg,dest); 21 //CVSOBEL(getimg,dest); 22 //CVLAPLACE(getimg,dest); 23 //CVCANNY(getimg); 24 //CVHOUGHCIRCLES(getimg); 25 //CVCHANGE(getimg); 26 cvNamedWindow("convolution"); 27 cvNamedWindow("originpicture"); 28 cvShowImage("originpicture",getimg); 29 30 cvShowImage("convolution",dest); 31 cvWaitKey(0); 32 cvReleaseImage(&getimg); 33 cvReleaseImage(&dest); 34 cvDestroyAllWindows(); 35 } 36 void CVFILTER2D(IplImage * img ,IplImage *dst) 37 { 38 CvMat *mat = cvCreateMat(400,500,CV_32F); 39 cvFilter2D(img, dst, mat);//cvPoint(1,1)); 40 } 41 //卷积边界 42 void CVCOPYMAKEBORDER(IplImage *ori, IplImage *dst) 43 { 44 cvCopyMakeBorder(ori,dst,cvPoint(1,1),IPL_BORDER_CONSTANT,cvScalarAll(255)); 45 } 46 //梯度和Sobel导数 47 void CVSOBEL(IplImage * img, IplImage *dst) 48 { 49 cvSobel(img,dst,0,1,3);//cvSobel(const CvArr* src,CvArr* dst,int xorder,int yorder,int aperture_size=3(1,3,5,7)) 50 } 51 //拉普拉斯变换 52 void CVLAPLACE(IplImage *img, IplImage *dst) 53 { 54 cvLaplace(img, dst); 55 } 56 //canny算子检测边界 57 void CVCANNY(IplImage *img) 58 { 59 IplImage *grayimg = cvCreateImage(cvGetSize(img),img->depth,1); 60 cvCvtColor(img,grayimg,CV_RGB2GRAY); 61 cvCanny(grayimg,grayimg,100,100,3); 62 cvShowImage("convolution", grayimg); 63 } 64 //霍夫圆变换 65 void CVHOUGHCIRCLES(IplImage *img) 66 { 67 //IplImage *img = cvLoadImage(filename); 68 69 IplImage *image = cvCreateImage(cvGetSize(img), img->depth, 1); 70 cvCvtColor(img, image, CV_RGB2GRAY); 71 CvMemStorage *storage = cvCreateMemStorage(0); 72 cvSmooth(image,image,CV_GAUSSIAN,5,5); 73 74 CvSeq *results = cvHoughCircles( 75 image, 76 storage, 77 CV_HOUGH_GRADIENT, 78 2, 79 image->width / 10 80 ); 81 for (int i = 0; i < results->total; i++) 82 { 83 float *p = (float *)cvGetSeqElem(results,i); 84 CvPoint pt = cvPoint(cvRound(p[0]),cvRound(p[1])); 85 cvCircle(image,pt,cvRound(p[2]),CV_RGB(0xff,0xff,0xff)); 86 } 87 cvShowImage("convolution",image); 88 89 } 90 //图像颠倒位置 91 void CVINVERT(IplImage *img) 92 { 93 //cvRectangle(img,cvPoint(220,160),cvPoint(280,220),cvScalar(200,100,100),5); 94 95 cvSetImageROI(img,cvRect(220,160,60,60)); 96 cvFlip(img,img,-1); 97 cvResetImageROI(img); 98 //cvCvtColor(img,img,CV_RGB2BGR); 99 //cvSmooth(img,img,CV_GAUSSIAN); 100 //cvShowImage("convolution",img); 101 } 102 void CVCHANGE(IplImage *img)//仿射变换 103 { 104 //定义两个CvPoint2D32F的数组 105 //第一个数组用来标定将要变换的原始图像中的区域 106 //第二个数组用来标定变换后的图像在窗口中的位置 107 CvPoint2D32f SrcTri[3], DstTri[3]; 108 //定义仿射映射矩阵,然后计算(2*3的矩阵) 109 CvMat *warp_mat = cvCreateMat(2,3,CV_32FC1); 110 CvMat *rot_mat = cvCreateMat(2, 3, CV_32FC1); 111 IplImage *src, *dst; 112 src = img; 113 dst = cvCloneImage(src); 114 SrcTri[0].x = 0; SrcTri[0].y = 0; 115 SrcTri[1].x = src->width-1; SrcTri[1].y = 0; 116 SrcTri[2].x = 0; SrcTri[2].y = src->height - 1; 117 DstTri[0].x = 0; DstTri[0].y = src->height*0.33; 118 DstTri[1].x = src->width*0.85; DstTri[1].y = src->height*0.25; 119 DstTri[2].x = src->width*0.15; DstTri[2].y = src->height*0.7; 120 //获取映射矩阵 121 cvGetAffineTransform(SrcTri,DstTri,warp_mat); 122 //映射变换 123 cvWarpAffine(src,dst,warp_mat); 124 cvCopy(dst,img); 125 //cvShowImage("convolution",dst); 126 //下面是对变换后的图像进一步旋转 127 CvPoint2D32f center = cvPoint2D32f(src->width/2,src->height/2); 128 double angle = 50.0; 129 double scale = 0.1; 130 //旋转图像 131 //上面center是旋转中心 132 //下面函数的第二个和第三个参数给出了旋转的角度和缩放的尺度 133 //最后一个参数是输出的映射矩阵 134 /*cv2DRotationMatrix( 135 CvPoint2D32F center 136 double angle 137 double scale 138 CvMat *map_matrix 139 )*/ 140 cv2DRotationMatrix(center,angle,scale,rot_mat); 141 cvWarpAffine(src,dst,rot_mat); 142 cvShowImage("convolution",dst); 143 }