OpenCV之旋转和掩膜

//旋转图像并掩码去除背景色
//x,y是图像的中心
IplImage* CLowCarbonDoc::RotateImg(IplImage* srcimg,float angle)
{
float m[6];
CvMat rotM=cvMat(2,3,CV_32F,m);
int srcwidth=srcimg->width;
int srcheight=srcimg->height;
int rotR=ceil(2.0*sqrtf(pow(srcwidth/2,2)+pow(srcheight/2,2)));
IplImage* frontimg=cvCreateImage(cvSize(rotR,rotR),srcimg->depth,srcimg->nChannels);
m[0]=cosf(-angle*2.0f*CV_PI/360.0f);
m[1]=-sinf(-angle*2.0f*CV_PI/360.0f);
m[3]=-m[1];
m[4]=m[0];
//将旋转中心移至图像中心
m[2]=srcwidth*0.5f;
m[5]=srcheight*0.5f;
cvZero(frontimg);
cvGetQuadrangleSubPix(srcimg,frontimg,&rotM);
return frontimg;
}


IplImage* CLowCarbonDoc::MaskImg(IplImage* frontimg)
{
IplImage* maskimg=cvCreateImage(cvGetSize(frontimg),IPL_DEPTH_8U,1);
cvCvtColor(frontimg,maskimg,CV_RGB2GRAY);
cvThreshold(maskimg,maskimg,200,255,CV_THRESH_BINARY);
cvNot(maskimg,maskimg);
return maskimg;
}

void CLowCarbonDoc::cvCopySubImg(IplImage* srcimg,CvRect rect,IplImage*subimg,IplImage* maskimg)
{
cvSetImageROI(srcimg,rect);
cvCopy(subimg,srcimg,maskimg);
cvResetImageROI(srcimg);
}

void CLowCarbonView::DrawBallon(IplImage* smallimg,CDC *pDC, int x, int y)
{
CLowCarbonDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
plImage* frontimg=pDoc->RotateImg(smallimg,90);
IplImage* maskimg=pDoc->MaskImg(frontimg);
int srcwidth=smallimg->width;
int srcheight=smallimg->height;
int rotR=ceil(2.0*sqrtf(pow(srcwidth/2,2)+pow(srcheight/2,2)));
pDoc->cvCopySubImg(bkimg,cvRect(x,y,rotR,rotR),frontimg,maskimg);
CRect rect;
GetClientRect(&rect);
img.CopyOf(bkimg);
img.DrawToHDC(pDC->GetSafeHdc(),&rect);
ReleaseDC(pDC);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值