OpenCV针对图像集检测图像

Sai*_*een 10 c++ opencv objective-c augmented-reality ios

我想知道如何使用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
Run Code Online (Sandbox Code Playgroud)

我想要检测的图像是2-5kb小.很少有文字在他们身上,但其他人只是迹象.这是一个例子:

在此输入图像描述

在此输入图像描述

你们知道我怎么做吗?

Sam*_*lix 8

这里有几件事.我将打破你的问题并指出你可能的解决方案.

  1. 分类:您的主要任务在于确定某个图像是否属于某个类.这个问题本身可以在几个问题中分解:

    • 特征表示您需要决定如何为特征建模,即如何在特征空间中表示每个图像,以便训练分类器来分离这些类.特征表示本身已经是一个重大的设计决策.可以(i)使用n个区域计算图像的直方图并训练分类器或(ii)您可以选择随机区域中的随机区域比较序列.但是,在培训结束后,您需要评估算法的性能,以确定您的决策有多好.

    • 有一个称为过度拟合的已知问题,即当你学得太好以至于无法推广你的分类器时.通过交叉验证通常可以避免这种情况.如果您不熟悉误报或漏报的概念,请参阅本文.

    • 定义特征空间后,您需要选择一种算法来训练该数据,这可能被视为您最大的决定.每天都有几种算法出现.举几个经典的:Naive Bayes,SVM,Random Forests,以及最近社区使用深度学习获得了很好的结果.其中每一个都有自己的特定用法(例如SVM非常适合二进制分类),您需要熟悉这个问题.您可以从简单的假设开始,例如随机变量之间的独立性,并训练Naive Bayes 分类器以尝试分离您的图像.

  2. 补丁:现在您提到您想要识别网络摄像头上的图像.如果要打印图像并在视频中显示,则需要处理几件事.有必要在大图像上定义补丁(从网络摄像头输入),在其中为每个补丁构建特征表示,并按照与上一步骤相同的方式进行分类.为此,您可以滑动窗口并对所有补丁进行分类,以查看它们是属于否定类还是属于正类.还有其他选择.

  3. 缩放:考虑到您能够在大图像中检测图像的位置并对其进行分类,下一步是放松玩具假设的修正比例.要处理多尺度方法,您可以对金字塔进行成像,这几乎可以让您在多分辨率下执行检测.替代方法可以考虑关键点检测器,例如SIFTSURF.在SIFT内部,有一个允许不变性的图像金字塔.

  4. 投影到目前为止,我们假设您在正交投影下有图像,但很可能您会有轻微的透视投影,这将使整个先前的假设失败.一个天真的解决方案是例如检测图像的白色背景的角落并在构建用于分类的特征向量之前纠正图像.如果您使用SIFT或SURF,您可以设计一种避免明确处理它的方法.然而,如果您的输入只是方形补丁,例如在ARToolkit中,我会去手动修正.

我希望我可以更好地了解你的问题.

  • 嗨,SIFT和SURF是关键点检测器.SIFT诞生的目的是识别"重要"点,这些点尽可能不变于缩放和透视变换,即携带强梯度信息的点.您可以使用关键点来设计您的功能,您可以摆脱规模问题.但如果我是你,我会从简单的假设(正交投影)开始,当你开始工作时,开始放松这些假设.youtube上有关于SIFT和SURF的讲座. (2认同)