OpenCV两张图片叠加,一张旋转一定的角度,另一张不变,如何叠加?

OpenCV大神帮忙,本人是OpenCV初学者,我想请教个问题,两张图片叠加,正常情况可以通过设置ROI然后进行拷贝即可,但是如果其中一张图片旋转了一定的角度以后要如何叠... OpenCV大神帮忙,本人是OpenCV初学者,我想请教个问题,两张图片叠加,正常情况可以通过设置ROI然后进行拷贝即可,但是如果其中一张图片旋转了一定的角度以后要如何叠加呢? 展开
 我来答
  • 你的回答被采纳后将获得:
  • 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者悬赏10(财富值+成长值)
bdwkzhbb
推荐于2016-05-11 · TA获得超过656个赞
知道小有建树答主
回答量:588
采纳率:84%
帮助的人:198万
展开全部

IplImage* rotateImage2(IplImage* img, int degree)//图像保留尺寸旋转

{

   double angle = degree  * CV_PI / 180.;

   double a = sin(angle), b = cos(angle);

   int width=img->width, height=img->height;

   //旋转后的新图尺寸

   int width_rotate= int(height * fabs(a) + width * fabs(b));

   int height_rotate=int(width * fabs(a) + height * fabs(b));

   IplImage* img_rotate = cvCreateImage(cvSize(width_rotate, height_rotate), img->depth, img->nChannels);

   cvZero(img_rotate);

   //保证原图可以任意角度旋转的最小尺寸

   int tempLength = sqrt((double)width * width + (double)height *height) + 10;

   int tempX = (tempLength + 1) / 2 - width / 2;

   int tempY = (tempLength + 1) / 2 - height / 2;

   IplImage* temp = cvCreateImage(cvSize(tempLength, tempLength), img->depth, img->nChannels);

   cvZero(temp);

   //将原图复制到临时图像tmp中心

   cvSetImageROI(temp, cvRect(tempX, tempY, width, height));

   cvCopy(img, temp, NULL);

   cvResetImageROI(temp);

   //旋转数组map

   // [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]

   // [ m3  m4  m5 ] ===>  [ A21  A22   b2 ]

   float m[6];

   int w = temp->width;

   int h = temp->height;

   m[0] = b;

   m[1] = a;

   m[3] = -m[1];

   m[4] = m[0];

   // 将旋转中心移至图像中间

   m[2] = w * 0.5f;

   m[5] = h * 0.5f;

   CvMat M = cvMat(2, 3, CV_32F, m);

   cvGetQuadrangleSubPix(temp, img_rotate, &M);

   cvReleaseImage(&temp);

   return img_rotate;
}


void main(){

    IplImage *src1 = cvLoadImage("E:/src1.png");

   IplImage *src2 = cvLoadImage("E:/src2.png");

   IplImage *t = rotateImage2(src2,20);

   cvShowImage("rotate",t);

   cvSetImageROI(src1,cvRect(20,20,t->width,t->height));

   cvAddWeighted(src1,0,t,1,0,src1);//参数(src1,a,src2,b,c,dst),

                                                        //计算公式:dst=src1*a+src2*b+c;这个函数改成自己的以实现透明效果

   cvResetImageROI(src1);

   cvShowImage("emerge",src1);

}

效果图:

旋转后

叠加:如果要使黑色的透明,则把cvAddWeighted函数换成自己写的,逐点读取图像,若点不是原来的图像的点,则使用另一张图像的值。

更多追问追答
追问
再请问,您说叠加的时候可以通过判断是不是原来图像的点,怎么判断是不是原来图像的点呢?通过颜色么?颜色应该不可靠吧?
追答
原图像本来是个矩形,旋转之后还是个矩形,用数学的方法肯定能判断的。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
东莞大凡
2024-08-07 广告
OpenCV标定板是东莞市大凡光学科技有限公司在相机标定中常用的工具。它通常由黑白格点按一定规则排列在平面上组成,如棋盘格或圆形格等。在相机标定时,将标定板置于不同位置和姿态下拍摄图像,利用OpenCV库中的函数检测标定板上的角点或圆心,进... 点击进入详情页
本回答由东莞大凡提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式