我从视频中捕获帧(1.)并希望将该矩形区域作为子图像投影到目标图像(2)中检测到的区域中。
目标图像中的区域(2。)不是正交的,我已经有了围绕目标区域绘制直线的坐标(由单应性确定)。
是否有任何方法可以提供复制源帧的功能(3.)(例如,使用双线性插值)到不同区域中的目标图像(4)?
我还需要翻译smaler (视频帧)图像。
发布于 2012-03-30 19:40:22
这幅图阐明了确切的需求。类似这样的代码应该可以:
void warpVideoToQuad(
IplImage *videoFrame,
IplImage *target,
CvSeq *tgt_quad)
{
int width = videoFrame->width, height = videoFrame->height;
CvPoint2D32f src_rect[] =
{ { 0.0, 0.0 }, { 0.0, height }, { width, height }, { width, 0.0 } };
CvPoint2D32f dst_quad[4];
// a little kludgy as cvGetPerspectiveTransform() and cvBoundingRect()
// use different arg types - the former a point array the latter a seq
cvCvtSeqToArray(tgt_quad, dst_quad);
CvMat *warper = cvCreateMat(3,3,CV_32FC1);
CvRect tgt_rect = cvBoundingRect(tgt_quad);
IplImage *warpTgt = cvCreateImage(CvSize(tgt_rect.width, tgt_rect.height),
videoFrame->depth, videoFrame->nChannels);
cvZero(warpTgt);
cvGetPerspectiveTransform(src_rect, dst_quad, &warper);
cvGetQuadrangleSubPix(videoFrame, warpTgt, warper);
cvSetImageROI(target, tgt_rect);
cvCopy(warpTgt, target, warpTgt);
cvResetImageROI(target);
delete warpTgt;
delete warper;
}
我现在不能测试这个,所以只是为了说明。稍后将根据需要进行编辑。
发布于 2012-03-30 19:34:08
我认为您想要使用warpPerspective()
来实现这一点。首先使用getPerspectiveTransform()
获得适当的透视变换(您在问题中绘制的四边形不是平行四边形,因此仿射变换不起作用)。该函数将视频帧的角点的像素坐标(0;0等)作为输入参数。以及您在目标区域中绘制的线条边角的像素坐标。现在您已经有了转换,可以将它与warpPerspective()
一起使用,将视频帧扭曲为目标图像大小的空白图像。使用带有感兴趣区域掩码的复制操作(如FrankH描述的那些)将扭曲区域插入到实际目标图像中。
https://stackoverflow.com/questions/9937863
复制相似问题