如何从Mask中删除视频

时间:2014-07-24 08:40:39

标签: c++ opencv video-processing javacv

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

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");
}

我的图像蒙版重新调整hsvThreshold(frame)此函数的IplImage。那时原始帧是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;
}

1 个答案:

答案 0 :(得分: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)