OpenCV根据图像集检测图像
我想知道如何使用OpenCV在我的VideoCamera上检测图像。 该图像可以是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小。 很少有他们的文字,但其他人只是迹象。 这里是一个例子:
你们知道我该怎么做吗?
这里有几件事。 我会分解你的问题,并指出你的一些可能的解决方案。
分类 :您的主要任务在于确定某个图像是否属于某个类别。 这个问题本身可以分解成几个问题:
特征表示您需要决定如何为特征建模,即如何在特征空间中表示每个图像,以便可以训练分类器来分离这些类。 特征表示本身已经是一个很大的设计决策。 人们可以(i)使用n箱计算图像的直方图并训练分类器,或者(ii)您可以选择一系列随机补丁比较,如在随机森林中。 但是,在训练之后,您需要评估算法的性能,以确定您的决策有多好。
有一个称为过度拟合的已知问题,就是当你学得太好时,你无法概括分类器。 这通常可以通过交叉验证来避免。 如果您对假阳性或假阴性的概念不熟悉,请参阅本文。
一旦你定义了你的特征空间,你需要选择一个算法来训练这些数据,这可能被认为是你最大的决定。 有几种算法每天都出来。 举几个经典的:朴素贝叶斯,SVM,随机森林,最近社区已经使用深度学习获得了很好的结果。 每个人都有自己的具体用法(例如,SVM对二进制分类非常有用),并且您需要熟悉问题。 您可以从简单的假设开始,例如随机变量之间的独立性,并训练朴素贝叶斯分类器以尝试分离图像。
补丁 :现在你提到你想识别你的摄像头上的图像。 如果您要打印图像并在视频中显示,您需要处理几件事情。 有必要在您的大图像上定义补丁(从网络摄像头输入),在其中为每个补丁构建特征表示并按照上一步中的相同方式进行分类。 为此,您可以滑动窗口并对所有补丁进行分类,以查看它们是属于否定类还是属于正面类。 还有其他的选择。
比例 :考虑到你能够检测大图像中的图像位置并对其进行分类,下一步就是放松玩具假设的修正比例。 要处理多尺度方法,您可以对金字塔进行图像处理,这几乎可以让您在多分辨率中执行检测。 替代方法可以考虑关键点检测器,例如SIFT和SURF。 在SIFT内部,有一个图像金字塔允许不变。
投影到目前为止,我们假设您在正投影下有图像,但很可能您会有轻微的透视投影,这会使整个先前的假设失败。 一个天真的解决方案就是例如检测图像的白色背景的角落,并在构建用于分类的特征向量之前纠正图像。 如果您使用SIFT或SURF,则可以设计一种避免明确处理该问题的方法。 不过,如果你的输入只会是正方形补丁,比如在ARToolkit中,我会去进行手动纠正。
我希望我可以让你更好地了解你的问题。
我建议使用SURF,因为图片可以在不同的距离形成你的相机,即改变比例。 我有一个类似的实验,SURF正如预期的那样工作。 但SURF的调整非常困难(并且操作昂贵),您应该在获得所需结果之前尝试不同的设置。
这是一个链接:http://docs.opencv.org/modules/nonfree/doc/feature_detection.html
YouTube视频(使用C#,但可以提供一个想法):http://www.youtube.com/watch?v = zjxWpKCQqJc
我可能没有足够的资格来回答这个问题。 上次我认真使用OpenCV的时候,它仍然是1.1。 但只是有些想法,并希望它会有所帮助(目前我对DIP和ML感兴趣)。
我认为如果你只需要对图像进行分类,如果图像只是你的500幅图像中的一幅(或非常相似),那么这可能会是一件容易的事情。 为此,您可以使用SVM或一些神经网络(Felix已经给出了一个很好的枚举)。
但是,您的问题似乎是您需要首先在您的摄像头中找到这个候选图像,而您的摄像头事先没有提供线索。 (让我们知道是否是这样,我认为这很重要。)
如果是这样,更难的问题是你的候选图像的检测/本地化。 我没有一个通用的解决方案。 我要做的第一件事就是看看你的500张照片中是否有一些共同特征(例如,它们是否全部被红色圆圈包围,或者一半有圆圈,一半有矩形)。 如果能做到这一点,问题就会变得更加简单(它会类似于人脸检测问题,它有很好的解决方案)。
换句话说,这意味着您首先将500幅图像分类为几组具有共同特征(由人类)的组,并首先检测该组,然后缩放并使用上述技术将其分类为精细结果。 以这种方式,它将比试图逐个检测500幅图像更具计算可接受性。
顺便说一句,这个PPT将有助于提供特征提取和图像匹配的视觉线索http://courses.cs.washington.edu/courses/cse455/09wi/Lects/lect6.pdf。
链接地址: http://www.djcxy.com/p/79577.html上一篇: OpenCV detect image against a image set
下一篇: Use Azure Machine learning to detect symbol within an image