我正在使用openCV为我的ios应用程序检测实时摄像机中的移动物体,但我不熟悉使用openCV请帮助我。任何其他方式也欢迎。
- (void)viewDidLoad {
[super viewDidLoad];
self.videoCamera.delegate = self;
self.videoCamera = [[CvVideoCamera alloc] initWithParentView:self.view];
self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPreset352x288;
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
self.videoCamera.defaultFPS = 30;
self.videoCamera.grayscaleMode = NO;
[self.videoCamera start];
// cv::BackgroundSubtractorMOG2 bg;
}
- (void)processImage:(cv::Mat&)image
{
//process here
cv::cvtColor(image, img, cv::COLOR_BGRA2RGB);
int fixedWidth = 270;
cv::resize(img, img, cv::Size(fixedWidth,(int)((fixedWidth*1.0f)* (image.rows/(image.cols*1.0f)))),cv::INTER_NEAREST);
//update the model
bg_model->operator()(img, fgmask, update_bg_model ? -1 : 0);
GaussianBlur(fgmask, fgmask, cv::Size(7, 7), 2.5, 2.5);
threshold(fgmask, fgmask, 10, 255, cv::THRESH_BINARY);
image = cv::Scalar::all(0);
img.copyTo(image, fgmask);
}
我是openCV的新手,所以我不知道该怎么做。
答案 0 :(得分:10)
将此代码添加到processImage
委托:
- (void)processImage:(cv::Mat&)image
{
//process here
cv::cvtColor(image, img, cv::COLOR_BGRA2RGB);
int fixedWidth = 270;
cv::resize(img, img, cv::Size(fixedWidth,(int)((fixedWidth*1.0f)* (image.rows/(image.cols*1.0f)))),cv::INTER_NEAREST);
//update the model
bg_model->apply(img, fgmask, update_bg_model ? -1 : 0);
GaussianBlur(fgmask, fgmask, cv::Size(7, 7), 2.5, 2.5);
threshold(fgmask, fgmask, 10, 255, cv::THRESH_BINARY);
image = cv::Scalar::all(0);
img.copyTo(image, fgmask);
}
您需要将以下内容声明为全局变量
cv::Mat img, fgmask;
cv::Ptr<cv::BackgroundSubtractor> bg_model;
bool update_bg_model;
Where, img <- smaller image fgmask <- the mask denotes that where motion is happening update_bg_model <- if you want to fixed your background;
Please refer this URL了解更多信息。
答案 1 :(得分:1)
我假设你想要一些与此演示相似的东西:https://www.youtube.com/watch?v=UFIVCDDnrmM 这为您提供了动作并删除了图像的背景。
任何时候你想要检测动作时,你经常必须先确定动作是什么以及它仍然是什么。通过拍摄几个帧并比较它们以确定部分是否足够不同以被视为不在后台中来完成该任务。 (通常超过一定的一致性阈值。)
要查找图像中的背景,请查看:http://docs.opencv.org/master/d1/dc5/tutorial_background_subtraction.html
后记你需要一个实现(可能是像canny这样的边缘检测器)才能识别你想要的对象并跟踪它的运动。 (确定速度,方向等)这将特定于您的用例,并且原始问题中没有足够的信息来具体说明您需要的内容。
要看的另一个非常好的资源是:http://www.intorobotics.com/how-to-detect-and-track-object-with-opencv/ 这甚至有一个专门用于使用opencv移动设备的部分。 (他们使用的使用场景是机器人技术,计算机视觉的最大应用之一,但你应该能够将它用于你需要的东西;虽然只做了一些修改。)
如果这有帮助,请告诉我,如果我可以做任何其他事情来帮助您。