//原创文章,转载注明出处;
OpenCV的类:
//OpenCVOperation.h
#pragma once
#include "cvaux.h"
#include "cxmisc.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
enum FlipType
{
//HorizontalVertical = -1;
Horizontal=0,
Vertical
};
class COpenCVOperation
{
public:
COpenCVOperation(void);
public:
~COpenCVOperation(void);
private:
IplImage * OperatedImage;
public:
IplImage* Resize(IplImage* rawImage, float fTime );
bool Flip( IplImage* &rawImage,FlipType FT );
bool Rotate( IplImage * & rawImage, int degree );
bool Move( IplImage * & rawImage, CvPoint pt );
IplImage * CutOut( IplImage * rawImage, CvRect rect );
IplImage* setWidthHeight(IplImage* rawImage, int Width, int Height );
void SaveImage(IplImage* rawImage, char * pImage);
IplImage* setImage2Gray( IplImage * rawImage = NULL);
IplImage * setImag2WB( IplImage * rawImage = NULL, int nThreshold=100 );
int Rotate(IplImage * m_pImageSrc, IplImage * m_pImageDst, double angle)
private:
void RotateMove(IplImage *img, int x, int y, float degree,int center[2]);
};
//OpenCVOperation.cpp
#include "StdAfx.h"
#include "OpenCVOperation.h"
COpenCVOperation::COpenCVOperation(void)
{
OperatedImage = NULL;
}
COpenCVOperation::~COpenCVOperation(void)
{
}
IplImage* COpenCVOperation::Resize( IplImage* rawImage, float fTime ) //放缩图像:
{
if ( rawImage == NULL || fTime <= 0 )
{
return NULL;
}
CvSize dst_cvsize;
dst_cvsize.width = rawImage->width*fTime;
dst_cvsize.height = rawImage->height*fTime;
if ( OperatedImage != NULL )
{
cvReleaseImage( &OperatedImage );
OperatedImage = NULL;
}
OperatedImage = cvCreateImage( dst_cvsize, rawImage->depth, rawImage->nChannels);
cvResize(rawImage,OperatedImage);
return OperatedImage;
CvvImage cvImage;
cvImage.CopyOf(OperatedImage);
cvReleaseImage(&OperatedImage);
}
bool COpenCVOperation::Flip( IplImage* &rawImage,FlipType FT ) //翻转:
{
if ( rawImage == NULL )
{
return 0;
}
cvFlip(rawImage,NULL,FT );
return true;
}
bool COpenCVOperation::Rotate( IplImage * & rawImage, int degree )
{
if ( rawImage == NULL )
{
return 0;
}
int center[2]={0,0};
center[0]=rawImage->width/2;
center[1]=rawImage->height/2;
RotateMove(rawImage,0,0,degree ,center);
return 1;
}
bool COpenCVOperation::Move( IplImage * & rawImage, CvPoint pt )
{
if ( rawImage == NULL )
{
return 0;
}
int center[2]={0,0};
RotateMove(rawImage, pt.x, pt.y, 0 ,center);
return 1;
}
void COpenCVOperation::RotateMove(IplImage *img, int x, int y, float degree,int center[2])
{
double angle = degree * CV_PI / 180.; // angle in radian
double a = sin(angle), b = cos(angle); // sine and cosine of angle
IplImage* imgSrc=cvCloneImage(img);
int w_src = imgSrc->width;
int h_src = imgSrc->height;
// Make w_dst and h_dst to fit the output image
//int w_dst = int(h_src * a + w_src * b);
//int h_dst = int(w_src * a + h_src * b);
//int w_dst = int(h_src * abs(a) + w_src * abs(b));
// int h_dst = int(w_src * abs(a) + h_src * abs(b));
// map matrix for WarpAffine, stored in statck array
double map[6];
CvMat map_matrix = cvMat(2, 3, CV_64FC1, map);
// Rotation center needed for cv2DRotationMatrix
CvPoint2D32f pt = cvPoint2D32f(center[0], center[1]);
cv2DRotationMatrix(pt, degree, 1.0, &map_matrix);
// otherwise you will get only part of the result
map[2] +=x;
map[5] +=y;
// We need a destination image
cvWarpAffine(
imgSrc,
img,
&map_matrix,
CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,
cvScalarAll(0)
);
}
IplImage * COpenCVOperation::CutOut( IplImage * rawImage, CvRect rect ) //裁剪:
{
if ( rawImage == NULL )
{
return NULL ;
}
CvMat submat ;
IplImage* img = rawImage;
CvMat matHearder;
CvMat* mat = cvGetMat( img, &matHearder );
cvGetSubRect(mat, &submat, rect/*cvRect(0, 0, 200, 200)*/) ;
OperatedImage = cvGetImage(&submat, rawImage ) ;
return OperatedImage;
}
IplImage* COpenCVOperation::setWidthHeight(IplImage* rawImage, int Width, int Height )
{
if ( rawImage == NULL )
{
return NULL;
}
if ( Width <= 0 || Height <= 0 )
{
return NULL;
}
CvSize dst_cvsize;
dst_cvsize.width = Width;
dst_cvsize.height = Height;
OperatedImage = cvCreateImage( dst_cvsize, rawImage->depth, rawImage->nChannels);
cvResize(rawImage,OperatedImage);
return OperatedImage;
}
void COpenCVOperation::SaveImage(IplImage* rawImage, char * pImage)
{
CvvImage cvImage;
cvImage.CopyOf(rawImage);
cvImage.Save( pImage );
}
IplImage * COpenCVOperation::setImage2Gray(IplImage * rawImage)
{
if ( rawImage == NULL )
{
return NULL;
}
CvSize toSize;
toSize.width = rawImage->width;
toSize.height = rawImage->height ;
static IplImage * ptoImage = NULL;
if ( ptoImage != NULL )
{
cvReleaseImage( &ptoImage );
ptoImage = NULL;
}
ptoImage = cvCreateImage(toSize,IPL_DEPTH_8U,1);
cvCvtColor(rawImage, ptoImage, CV_RGB2GRAY);
return ptoImage;
}
IplImage * COpenCVOperation::setImag2WB( IplImage * rawImage, int nThreshold ) //二值化;
{
if ( rawImage == NULL )
{
return 0;
}
IplImage * pImage = setImage2Gray( rawImage );
cvThreshold( pImage, pImage, nThreshold, 255, CV_THRESH_BINARY );
return pImage;
}
#include "StdAfx.h"
#include "OpenCVOperation.h"
COpenCVOperation::COpenCVOperation(void)
{
OperatedImage = NULL;
}
COpenCVOperation::~COpenCVOperation(void)
{
}
IplImage* COpenCVOperation::Resize( IplImage* rawImage, float fTime ) //放缩图像:
{
if ( rawImage == NULL || fTime <= 0 )
{
return NULL;
}
CvSize dst_cvsize;
dst_cvsize.width = rawImage->width*fTime;
dst_cvsize.height = rawImage->height*fTime;
if ( OperatedImage != NULL )
{
cvReleaseImage( &OperatedImage );
OperatedImage = NULL;
}
OperatedImage = cvCreateImage( dst_cvsize, rawImage->depth, rawImage->nChannels);
cvResize(rawImage,OperatedImage);
return OperatedImage;
CvvImage cvImage;
cvImage.CopyOf(OperatedImage);
cvReleaseImage(&OperatedImage);
}
bool COpenCVOperation::Flip( IplImage* &rawImage,FlipType FT ) //翻转:
{
if ( rawImage == NULL )
{
return 0;
}
cvFlip(rawImage,NULL,FT );
return true;
}
bool COpenCVOperation::Rotate( IplImage * & rawImage, int degree )
{
if ( rawImage == NULL )
{
return 0;
}
int center[2]={0,0};
center[0]=rawImage->width/2;
center[1]=rawImage->height/2;
RotateMove(rawImage,0,0,degree ,center);
return 1;
}
bool COpenCVOperation::Move( IplImage * & rawImage, CvPoint pt )
{
if ( rawImage == NULL )
{
return 0;
}
int center[2]={0,0};
RotateMove(rawImage, pt.x, pt.y, 0 ,center);
return 1;
}
void COpenCVOperation::RotateMove(IplImage *img, int x, int y, float degree,int center[2])
{
double angle = degree * CV_PI / 180.; // angle in radian
double a = sin(angle), b = cos(angle); // sine and cosine of angle
IplImage* imgSrc=cvCloneImage(img);
int w_src = imgSrc->width;
int h_src = imgSrc->height;
// Make w_dst and h_dst to fit the output image
//int w_dst = int(h_src * a + w_src * b);
//int h_dst = int(w_src * a + h_src * b);
//int w_dst = int(h_src * abs(a) + w_src * abs(b));
// int h_dst = int(w_src * abs(a) + h_src * abs(b));
// map matrix for WarpAffine, stored in statck array
double map[6];
CvMat map_matrix = cvMat(2, 3, CV_64FC1, map);
// Rotation center needed for cv2DRotationMatrix
CvPoint2D32f pt = cvPoint2D32f(center[0], center[1]);
cv2DRotationMatrix(pt, degree, 1.0, &map_matrix);
// otherwise you will get only part of the result
map[2] +=x;
map[5] +=y;
// We need a destination image
cvWarpAffine(
imgSrc,
img,
&map_matrix,
CV_INTER_LINEAR | CV_WARP_FILL_OUTLIERS,
cvScalarAll(0)
);
}
IplImage * COpenCVOperation::CutOut( IplImage * rawImage, CvRect rect ) //裁剪:
{
if ( rawImage == NULL )
{
return NULL ;
}
CvMat submat ;
IplImage* img = rawImage;
CvMat matHearder;
CvMat* mat = cvGetMat( img, &matHearder );
cvGetSubRect(mat, &submat, rect/*cvRect(0, 0, 200, 200)*/) ;
OperatedImage = cvGetImage(&submat, rawImage ) ;
return OperatedImage;
}
IplImage* COpenCVOperation::setWidthHeight(IplImage* rawImage, int Width, int Height )
{
if ( rawImage == NULL )
{
return NULL;
}
if ( Width <= 0 || Height <= 0 )
{
return NULL;
}
CvSize dst_cvsize;
dst_cvsize.width = Width;
dst_cvsize.height = Height;
OperatedImage = cvCreateImage( dst_cvsize, rawImage->depth, rawImage->nChannels);
cvResize(rawImage,OperatedImage);
return OperatedImage;
}
void COpenCVOperation::SaveImage(IplImage* rawImage, char * pImage)
{
CvvImage cvImage;
cvImage.CopyOf(rawImage);
cvImage.Save( pImage );
}
IplImage * COpenCVOperation::setImage2Gray(IplImage * rawImage)
{
if ( rawImage == NULL )
{
return NULL;
}
CvSize toSize;
toSize.width = rawImage->width;
toSize.height = rawImage->height ;
static IplImage * ptoImage = NULL;
if ( ptoImage != NULL )
{
cvReleaseImage( &ptoImage );
ptoImage = NULL;
}
ptoImage = cvCreateImage(toSize,IPL_DEPTH_8U,1);
cvCvtColor(rawImage, ptoImage, CV_RGB2GRAY);
return ptoImage;
}
IplImage * COpenCVOperation::setImag2WB( IplImage * rawImage, int nThreshold ) //二值化;
{
if ( rawImage == NULL )
{
return 0;
}
IplImage * pImage = setImage2Gray( rawImage );
cvThreshold( pImage, pImage, nThreshold, 255, CV_THRESH_BINARY );
return pImage;
}
int HHT_Image::Rotate(IplImage * m_pImageSrc, IplImage * m_pImageDst, double angle)
{
float hsrc,wsrc,hdst,wdst;
CvPoint2D32f srcTri[3],dstTri[3];
CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1);
CvMat* warp_mat = cvCreateMat(2,3,CV_32FC1);
int df1(0),df2(0),df3(0),df4(0),df5(0),df6(0);
double scale,scaleh,scalew;
float delta = 0.01;
if(!m_pImageSrc||!m_pImageDst)
{
return 0;
}
hsrc = m_pImageSrc->height;
wsrc = m_pImageSrc->width;
if(angle < 0)
{
angle = (int)angle % 360 + 360;
}
if(0 == (int)angle % 180 /90)
{
hdst = sqrt(hsrc * hsrc + wsrc *wsrc) * sin( (int)angle % 180 / 180.0 * CV_PI + atan2(hsrc, wsrc) );//×¢Ò⣺ÕâÀïÄ£³ýÊÇintÀàÐ͵ģ¬µ«ÊÇÔÚ³ËÒÔCV_PIÇ°Ëã³öµÄ½á¹ûӦΪСÊý£¨ÒòΪСÓÚÒ»£¬»»ÎªInt¾ÍΪ0ÁË£¬ËùÒÔ³ýÊý180£¬ÒªÐ´Îª180.0£¡£¡£¡£©
wdst = sqrt(hsrc * hsrc + wsrc *wsrc) * cos( atan2(hsrc, wsrc) - (int)angle % 180 / 180.0 * CV_PI );
}else if(1 == (int)angle % 180 /90)
{
hdst = sqrt(hsrc * hsrc + wsrc *wsrc) * sin( (180 - (int)angle % 180) / 180.0 * CV_PI + atan2(hsrc, wsrc) );//Ðýתºóʵ¼ÊͼµÄ¸ß
wdst = sqrt(hsrc * hsrc + wsrc *wsrc) * cos( atan2(hsrc, wsrc) - (180 - (int)angle % 180) / 180.0 * CV_PI );//Ðýתºóʵ¼ÊͼµÄ¿í
}
scaleh = hsrc / hdst;//ÐýתºóÔͼÓëÐÂͼ¸ßÖ®±È
scalew = wsrc / wdst;//ÐýתºóÔͼÓëÐÂͼ¿íÖ®±È
if(scaleh <= scalew )//ѡȡͼÏñºÏÊÊËõ·Å±ÈÀý¡££¨Ñ¡È¡Ð¡µÄ£©
{
scale = scaleh;
}else
{
scale = scalew;
}
srcTri[0].x = 0;
srcTri[0].y = 0;
srcTri[1].x = m_pImageSrc->width-1;
srcTri[1].y = 0;
srcTri[2].x = 0;
srcTri[2].y = m_pImageSrc->height-1;
cvZero(m_pImageDst);
dstTri[0].x = m_pImageSrc->width*delta*(df1%101);
dstTri[0].y = m_pImageSrc->height*delta*(df2%101);
dstTri[1].x = m_pImageSrc->width-1 + m_pImageSrc->width*delta*(df3%101);
dstTri[1].y = m_pImageSrc->height*delta*(df4%101);
dstTri[2].x = m_pImageSrc->width*delta*(df5%101);
dstTri[2].y = m_pImageSrc->height-1 + m_pImageSrc->height*delta*(df6%101);
cvGetAffineTransform(srcTri,dstTri,warp_mat);
// cvWarpAffine(m_pImageSrc,m_pImageDst,warp_mat);
cvWarpAffine( m_pImageSrc,m_pImageDst,warp_mat,CV_WARP_FILL_OUTLIERS,cvScalarAll(255) );
CvPoint2D32f center = cvPoint2D32f(m_pImageSrc->width/2,m_pImageSrc->height/2);
cv2DRotationMatrix(center,angle,scale,rot_mat);
//cvWarpAffine(m_pImageSrc,m_pImageDst,rot_mat);
cvWarpAffine( m_pImageSrc,m_pImageDst,rot_mat,CV_WARP_FILL_OUTLIERS,cvScalarAll(255) );
cvReleaseMat(&rot_mat);
cvDecRefData( rot_mat );
cvReleaseMat(&warp_mat);
cvDecRefData( warp_mat );
return 1;
}