我正在为我的iOS应用程序使用openCV来检测实时摄像机中的移动物体,但我不熟悉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的新手,所以我不知道该怎么办。
将此代码添加到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;
有关详细信息,请参阅此 URL。
我假设你想要一些与这个演示性质相似的东西: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的移动设备。(他们正在使用的使用场景是机器人技术,这是计算机视觉的最大应用之一,但你应该能够将其用于您需要的东西;尽管进行了一些修改。
请让我知道这是否有帮助,以及我是否可以做任何其他事情来帮助您。