机器视觉入门之路(十六,完成图像旋转,c++)

原理已经讲完,图像旋转代码实现如下(以图像中心旋转):

void RotateNormal(BYTE * image0,BYTE * &image1,unsigned int w,unsigned int h,
                         unsigned int & outwidth,unsigned int & outheight,double angle)
{// 原始图像四个角的坐标
    int srcX1,srcX2,srcX3,srcX4;
    int srcY1,srcY2,srcY3,srcY4;

    srcX1=0;
    srcY1=0;
    srcX2=w-1;
    srcY2=0;
    srcX3=0;
    srcY3=h-1;
    srcX4=w-1;
    srcY4=h-1;
// 计算旋转角度的正弦和余弦值
    double fsin=sin(angle);
    double fcos=cos(angle);
// 图像经过旋转后四个角的坐标
    double desX1,desX2,desX3,desX4;
    double desY1,desY2,desY3,desY4;

    desX1=fcos*srcX1+fsin*srcY1;
    desY1=-fsin*srcX1+fcos*srcY1;
    desX2=fcos*srcX2+fsin*srcY2;
    desY2=-fsin*srcX2+fcos*srcY2;
    desX3=fcos*srcX3+fsin*srcY3;
    desY3=-fsin*srcX3+fcos*srcY3;
    desX4=fcos*srcX4+fsin*srcY4;
    desY4=-fsin*srcX4+fcos*srcY4;

    /*int*/ outwidth=(int)(max(fabs(desX4-desX1),fabs(desX3-desX2))+0.5);
    /*int*/ outheight=(int)(max(fabs(desY4-desY1),fabs(desY3-desY2))+0.5);

    image1=new BYTE[outwidth*outheight*4];
    memset(image1,255,outwidth*outheight*4);

    double num1=-0.5*outwidth*fcos-0.5*outheight*fsin+0.5*w;
    double num2=0.5*outwidth*fsin-0.5*outheight*fcos+0.5*h;

    BYTE *copypixel=NULL;
    BYTE *objpixel=NULL;
    int  x=0;
    int  y=0;

    for(int j=0;j<outheight;j++)
        for(int i=0;i<outwidth;i++)
        {
            x=(int)(i*fcos+j*fsin+num1+0.5);
            y=(int)(-i*fsin+j*fcos+num2+0.5);

            if(x==w)
                x--;
            if(y==h)
                y--;

            copypixel=image0+y*w*4+x*4;
            objpixel=image1+j*outwidth*4+i*4;
            
            if(x>=0 && x<w && y>=0 && y<h)
                memcpy(objpixel,copypixel,4);
        }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值