OpenCV两张图片叠加,一张旋转一定的角度,另一张不变,如何叠加?
- 你的回答被采纳后将获得:
- 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者悬赏10(财富值+成长值)
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 广告