您的位置:首页 > 运维架构

学习opencv-------函数使用二(图像变换)

2014-09-20 19:42 281 查看
#include"cv.h"
#include"highgui.h"
using namespace cv;
void CVFILTER2D(IplImage * img, IplImage *dst);
void CVCOPYMAKEBORDER(IplImage *ori, IplImage *dst);
void CVSOBEL(IplImage * img, IplImage *dst);
void CVLAPLACE(IplImage *img, IplImage *dst);
void CVCANNY(IplImage *img);
void CVHOUGHCIRCLES(IplImage *img);
void CVINVERT(IplImage *img);
void CVCHANGE(IplImage *img);
int main()
{
IplImage *fromimg = cvLoadImage("e:/picture/Wife2.jpg");
IplImage *getimg = cvCreateImage(cvSize(400,600),fromimg->depth,fromimg->nChannels);
cvResize(fromimg,getimg);
//IplImage *dest = cvCreateImage(cvSize(getimg->width+1,getimg->height+1),getimg->depth,getimg->nChannels);//for cvCopyMakeBorder()
IplImage *dest = cvCreateImage(cvSize(getimg->width, getimg->height), getimg->depth, getimg->nChannels);
CVFILTER2D(getimg,dest);
//CVCOPYMAKEBORDER(getimg,dest);
//CVSOBEL(getimg,dest);
//CVLAPLACE(getimg,dest);
//CVCANNY(getimg);
//CVHOUGHCIRCLES(getimg);
//CVCHANGE(getimg);
cvNamedWindow("convolution");
cvNamedWindow("originpicture");
cvShowImage("originpicture",getimg);

cvShowImage("convolution",dest);
cvWaitKey(0);
cvReleaseImage(&getimg);
cvReleaseImage(&dest);
cvDestroyAllWindows();
}
void CVFILTER2D(IplImage * img ,IplImage *dst)
{
CvMat *mat = cvCreateMat(400,500,CV_32F);
cvFilter2D(img, dst, mat);//cvPoint(1,1));
}
//卷积边界
void CVCOPYMAKEBORDER(IplImage *ori, IplImage *dst)
{
cvCopyMakeBorder(ori,dst,cvPoint(1,1),IPL_BORDER_CONSTANT,cvScalarAll(255));
}
//梯度和Sobel导数
void CVSOBEL(IplImage * img, IplImage *dst)
{
cvSobel(img,dst,0,1,3);//cvSobel(const CvArr* src,CvArr* dst,int xorder,int yorder,int aperture_size=3(1,3,5,7))
}
//拉普拉斯变换
void CVLAPLACE(IplImage *img, IplImage *dst)
{
cvLaplace(img, dst);
}
//canny算子检测边界
void CVCANNY(IplImage *img)
{
IplImage *grayimg = cvCreateImage(cvGetSize(img),img->depth,1);
cvCvtColor(img,grayimg,CV_RGB2GRAY);
cvCanny(grayimg,grayimg,100,100,3);
cvShowImage("convolution", grayimg);
}
//霍夫圆变换
void CVHOUGHCIRCLES(IplImage *img)
{
//IplImage *img = cvLoadImage(filename);

IplImage *image = cvCreateImage(cvGetSize(img), img->depth, 1);
cvCvtColor(img, image, CV_RGB2GRAY);
CvMemStorage *storage = cvCreateMemStorage(0);
cvSmooth(image,image,CV_GAUSSIAN,5,5);

CvSeq *results = cvHoughCircles(
image,
storage,
CV_HOUGH_GRADIENT,
2,
image->width / 10
);
for (int i = 0; i < results->total; i++)
{
float *p = (float *)cvGetSeqElem(results,i);
CvPoint pt = cvPoint(cvRound(p[0]),cvRound(p[1]));
cvCircle(image,pt,cvRound(p[2]),CV_RGB(0xff,0xff,0xff));
}
cvShowImage("convolution",image);

}
//图像颠倒位置
void CVINVERT(IplImage *img)
{
//cvRectangle(img,cvPoint(220,160),cvPoint(280,220),cvScalar(200,100,100),5);

cvSetImageROI(img,cvRect(220,160,60,60));
cvFlip(img,img,-1);
cvResetImageROI(img);
//cvCvtColor(img,img,CV_RGB2BGR);
//cvSmooth(img,img,CV_GAUSSIAN);
//cvShowImage("convolution",img);
}
void CVCHANGE(IplImage *img)//仿射变换
{
//定义两个CvPoint2D32F的数组
//第一个数组用来标定将要变换的原始图像中的区域
//第二个数组用来标定变换后的图像在窗口中的位置
CvPoint2D32f SrcTri[3], DstTri[3];
//定义仿射映射矩阵,然后计算(2*3的矩阵)
CvMat *warp_mat = cvCreateMat(2,3,CV_32FC1);
CvMat *rot_mat = cvCreateMat(2, 3, CV_32FC1);
IplImage *src, *dst;
src = img;
dst = cvCloneImage(src);
SrcTri[0].x = 0; SrcTri[0].y = 0;
SrcTri[1].x = src->width-1; SrcTri[1].y = 0;
SrcTri[2].x = 0; SrcTri[2].y = src->height - 1;
DstTri[0].x = 0; DstTri[0].y = src->height*0.33;
DstTri[1].x = src->width*0.85; DstTri[1].y = src->height*0.25;
DstTri[2].x = src->width*0.15; DstTri[2].y = src->height*0.7;
//获取映射矩阵
cvGetAffineTransform(SrcTri,DstTri,warp_mat);
//映射变换
cvWarpAffine(src,dst,warp_mat);
cvCopy(dst,img);
//cvShowImage("convolution",dst);
//下面是对变换后的图像进一步旋转
CvPoint2D32f center = cvPoint2D32f(src->width/2,src->height/2);
double angle = 50.0;
double scale = 0.1;
//旋转图像
//上面center是旋转中心
//下面函数的第二个和第三个参数给出了旋转的角度和缩放的尺度
//最后一个参数是输出的映射矩阵
/*cv2DRotationMatrix(
CvPoint2D32F center
double angle
double scale
CvMat *map_matrix
)*/
cv2DRotationMatrix(center,angle,scale,rot_mat);
cvWarpAffine(src,dst,rot_mat);
cvShowImage("convolution",dst);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: