首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以将视频帧投影到另一幅图像中?

是否可以将视频帧投影到另一幅图像中?
EN

Stack Overflow用户
提问于 2012-03-30 14:14:00
回答 2查看 248关注 0票数 2

我从视频中捕获帧(1.)并希望将该矩形区域作为子图像投影到目标图像(2)中检测到的区域中。

目标图像中的区域(2。)不是正交的,我已经有了围绕目标区域绘制直线的坐标(由单应性确定)。

是否有任何方法可以提供复制源帧的功能(3.)(例如,使用双线性插值)到不同区域中的目标图像(4)?

我还需要翻译smaler (视频帧)图像。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-30 19:40:22

这幅图阐明了确切的需求。类似这样的代码应该可以:

代码语言:javascript
运行
复制
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;
}

我现在不能测试这个,所以只是为了说明。稍后将根据需要进行编辑。

票数 2
EN

Stack Overflow用户

发布于 2012-03-30 19:34:08

我认为您想要使用warpPerspective()来实现这一点。首先使用getPerspectiveTransform()获得适当的透视变换(您在问题中绘制的四边形不是平行四边形,因此仿射变换不起作用)。该函数将视频帧的角点的像素坐标(0;0等)作为输入参数。以及您在目标区域中绘制的线条边角的像素坐标。现在您已经有了转换,可以将它与warpPerspective()一起使用,将视频帧扭曲为目标图像大小的空白图像。使用带有感兴趣区域掩码的复制操作(如FrankH描述的那些)将扭曲区域插入到实际目标图像中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9937863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档