openframeworks上使用ofVideoGrabber去除背景
时间: 2023-07-20 13:32:10 浏览: 132
在 openFrameworks 中,您可以使用 `ofVideoGrabber` 类来捕获视频,并使用 `ofxCv` 和 `ofxOpenCv` 两个附加库来进行图像处理。下面是一个使用 `ofVideoGrabber` 实现去除背景的示例代码:
```c++
#include "ofMain.h"
#include "ofxCv.h"
using namespace cv;
using namespace ofxCv;
class ofApp : public ofBaseApp{
public:
void setup(){
// 打开摄像头
grabber.setup(640, 480);
// 初始化背景差分器
background.setLearningTime(100);
background.setThresholdValue(30);
// 初始化显示窗口
ofSetWindowShape(grabber.getWidth() * 2, grabber.getHeight());
}
void update(){
// 获取一帧视频
grabber.update();
// 如果有新帧,进行背景差分处理
if (grabber.isFrameNew()) {
// 将视频帧转换为 OpenCV 图像
Mat input = toCv(grabber);
// 背景差分
background.update(input, mask);
// 使用掩模图像和原始图像进行按位与操作,得到只包含前景的原始图像
bitwise_and(input, input, masked, toCv(mask));
// 将得到的原始图像与一个全白色的图像进行按位或操作,得到背景恢复的图像
bitwise_or(masked, Scalar(255, 255, 255) - toCv(mask), output);
// 将 OpenCV 图像转换为 ofImage
toOf(output, result);
}
}
void draw(){
// 显示原始视频和去除背景的视频
grabber.draw(0, 0);
result.draw(grabber.getWidth(), 0);
}
private:
ofVideoGrabber grabber;
BackgroundSubtractorMOG2 background;
ofImage result;
Mat mask, masked, output;
};
int main(){
ofSetupOpenGL(1280, 480, OF_WINDOW);
ofRunApp(new ofApp());
}
```
这个示例代码使用 `ofVideoGrabber` 类从摄像头中捕获视频,然后使用 `BackgroundSubtractorMOG2` 类进行背景差分处理,最后使用 `ofImage` 类显示去除背景的视频。您可以根据需要调整代码中的参数和布局。
阅读全文