C++ 如何从蒙版中获取减法视频
我想从网络摄像头视频中减去绿色背景。 贝娄展示了我是如何从网络摄像头中获取视频的C++ 如何从蒙版中获取减法视频,c++,opencv,video-processing,javacv,C++,Opencv,Video Processing,Javacv,我想从网络摄像头视频中减去绿色背景。 贝娄展示了我是如何从网络摄像头中获取视频的 public static void main(String[] args) { CvCapture capture =cvCreateCameraCapture(CV_CAP_ANY); // IplImage frame; IplImage grayimg = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvNamedWi
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;
}
如果要复制图像而不复制遮罩中的像素,可以使用函数
cvCopy(origImage、destImage、mask)代码>。有关更多信息,请参见此
<>我建议你切换到C++ API,它更容易理解,更不用担心释放图像和内存泄漏。
编辑:
也可以将一个图像复制到另一个图像上,而无需cvCopy。你可以在这篇文章中找到代码:你的问题到底是什么?你收到错误信息了吗?遮罩是否与预期不符?我想找到一种从原始图像中减去遮罩的方法?掩码在imgThreshold中返回,原始图像为frameMy originalFrame,掩码类型为IplImage和originalFrame通道3和掩码通道1。因此cvcopy不工作。掩码应仅为1个通道和一个二进制图像。原始图像和目标图像的频道数量必须相同。您是否首先使用函数cvCreateImage()
创建了Destinmage?是的。我想使用背景透明度获取结果图像…是否可能如果您想在另一个现有图像上使用遮罩复制一个图像,您可能必须使用cvSetImageROI
设置ROI。在这里你可以找到文档:再次使用新的C++ API要简单得多。