OpenCV类

//原创文章,转载注明出处;

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;


 }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chinabinlang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值