如何从 Mask 中获取减去的视频

Posted

技术标签:

【中文标题】如何从 Mask 中获取减去的视频【英文标题】:How to get subtracted video from Mask 【发布时间】:2014-07-24 08:40:38 【问题描述】:

我想从网络摄像头视频中减去绿色背景。 下面显示了我如何从网络摄像头获取视频

public static void main(String[] args) 

    CvCapture capture =cvCreateCameraCapture(CV_CAP_ANY);  //
    IplImage frame;

    IplImage grayimg = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

    cvNamedWindow("Video",CV_WINDOW_AUTOSIZE);

    for(;;)
    
        frame = cvQueryFrame(capture);


        if(frame == null) 
            
                System.out.println("ERROR: NO Video File"); 
                break;
            

        cvShowImage("Video",hsvThreshold(frame));
        char c = (char) cvWaitKey(30);

        if(c==27) break;
    

    cvReleaseCapture(capture);
    cvDestroyWindow("Video");

我的Image Mask是retun IplImage的hsvThreshold(frame)这个函数。当时原帧是frame

所以我想提取面具 hsvThreshold(frame)是这样的

     public static IplImage hsvThreshold(IplImage orgImg) 
    // 8-bit, 3- color =(RGB)
    IplImage imgHSV = cvCreateImage(cvGetSize(orgImg), 8, 3);
    System.out.println(cvGetSize(orgImg));
    cvCvtColor(orgImg, imgHSV, CV_BGR2HSV);
    // 8-bit 1- color = monochrome
    IplImage imgThreshold = cvCreateImage(cvGetSize(orgImg), 8, 1);

    cvInRangeS(imgHSV, cvScalar(70, 50, 50, 0), cvScalar(150, 200, 200, 0), imgThreshold);
    cvReleaseImage(imgHSV);
    cvSmooth(imgThreshold, imgThreshold, CV_GAUSSIAN, 13);
    cvNot(imgThreshold,imgThreshold);
    return imgThreshold;

【问题讨论】:

您的问题到底是什么?您收到错误消息吗?口罩不符合预期? 我想找到一种方法从原始图像中减去蒙版?在 imgThreshold 中返回掩码,原图为 frame 【参考方案1】:

如果您想复制没有蒙版中像素的图像,您可以使用函数cvCopy(origImage,destImage,mask);。请参阅此SO post 了解更多信息。

不过,我确实建议您切换到 C++ API,它更容易理解,并且更少担心释放图像和内存泄漏。

编辑: 您也可以在不使用 cvCopy 的情况下将一个图像复制到另一个图像上。你可以在这篇文章中找到代码:Copying a portion of an IplImage into another Iplimage (that is of same size is the source)

【讨论】:

我的 originalFrame 和 Mask 类型是 IplImage 和 originalFrame 通道 3 和 mask 通道 1.so cvcopy 不工作 一个掩码应该只有一个通道和一个二值图像。您的原始图像和目标图像需要具有相同数量的通道。你是先用cvCreateImage()函数创建destImage的吗? 是的。我想得到带有背景透明图案的结果图像...有可能 如果您想在另一张现有图像上复制带有蒙版的图像,您可能需要使用cvSetImageROI 设置 ROI。在这里您可以找到文档:docs.opencv.org/trunk/modules/core/doc/… 同样,使用新的 C++ API 更加简单。

以上是关于如何从 Mask 中获取减去的视频的主要内容,如果未能解决你的问题,请参考以下文章

如何从android中录制的视频中获取视频名称?

如何从使用 jquery 动态创建的视频标签中获取视频持续时间?

iPhone:如何获取从库中选择的视频时长?

如何从嵌入式视频中获取缩略图?

使用 mask 实现视频弹幕人物遮罩过滤

如何从能够搜索的谷歌云存储对象中获取视频流