我想知道如何使用 OpenCV 在我的摄像机上检测图像。图片可以是 500 张图片中的一张。
我现在在做什么:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView];
self.videoCamera.delegate = self;
self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionBack;
self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPresetHigh;
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
self.videoCamera.defaultFPS = 30;
self.videoCamera.grayscaleMode = NO;
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
[self.videoCamera start];
}
#pragma mark - Protocol CvVideoCameraDelegate
#ifdef __cplusplus
- (void)processImage:(cv::Mat&)image;
{
// Do some OpenCV stuff with the image
cv::Mat image_copy;
cvtColor(image, image_copy, CV_BGRA2BGR);
// invert image
//bitwise_not(image_copy, image_copy);
//cvtColor(image_copy, image, CV_BGR2BGRA);
}
#endif
我想要检测的图像小 2-5kb。很少有人在他们身上得到文字,但其他人只是标志。这里有一个例子:
你们知道我该怎么做吗?
最佳答案
这里有几个东西。我将分解您的问题并指出一些可能的解决方案。
分类:您的主要任务是确定某个图像是否属于某个类别。这个问题本身可以分解成几个问题:
Feature Representation您需要决定如何为您的特征 建模,即您将如何在特征空间中表示每个图像,以便您可以训练分类器来分离这些类。特征表示本身已经是一个重大的设计决策。可以 (i) 计算 histogram使用 n 个 bin 对图像进行分类并训练分类器,或者 (ii) 您可以选择一系列随机补丁比较,例如在随机森林中。但是,训练结束后,您需要评估算法的性能,看看您的决定有多好。
有一个名为 overfitting 的已知问题,这是当你学得太好以至于你不能概括你的分类器。这通常可以通过 cross-validation 来避免。 .如果您不熟悉假阳性或假阴性的概念,请查看此 article .
定义特征空间后,您需要选择一种算法来训练该数据,这可能被认为是您最大的决定。每天都有几种算法出来。举几个经典的例子:Naive Bayes , SVM , Random Forests ,最近社区使用 Deep learning 取得了很好的成果.每一个都有自己的特定用途(例如 SVM 非常适合二进制分类),您需要熟悉这个问题。您可以从简单的假设开始,例如随机变量之间的独立性,然后训练朴素贝叶斯 classifier尝试分离您的图像。
补丁:现在您提到您想要识别网络摄像头中的图像。如果您要打印图像并在视频中显示,您需要处理几件事情。有必要在大图像(来自网络摄像头的输入)上定义补丁,在其中为每个补丁构建一个特征表示,并按照与上一步相同的方式进行分类。为此,您可以滑动一个窗口并对所有补丁进行分类,以查看它们是属于负类还是属于正类之一。还有其他选择。
比例:考虑到您能够检测图像在大图像中的位置并对其进行分类,下一步是放宽固定比例的玩具假设。要处理多尺度方法,您可以想象 pyramid这几乎允许您以多分辨率执行检测。替代方法可以考虑关键点检测器,例如 SIFT和 SURF .在 SIFT 内部,有一个允许不变性的图像金字塔。
投影 到目前为止,我们假设您的图像是在正射投影下,但很可能您会有轻微的透视投影,这将使整个先前的假设失败。例如,一种天真的解决方案是检测图像白色背景的角并在构建用于分类的特征向量之前校正图像。如果您使用 SIFT 或 SURF,您可以设计一种避免显式处理它的方法。不过,如果您的输入只是方 block ,例如 ARToolkit ,我会去人工整改。
我希望我可以让您更好地了解您的问题。
关于c++ - OpenCV 根据图像集检测图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22118010/