【问题标题】:How to detect specific object in image如何检测图像中的特定对象
【发布时间】:2020-05-16 00:12:49
【问题描述】:

我有 32 个字母卡,例如 OSMO 应用程序 (https://www.playosmo.com/en/words/)。
我想在图像中或在相机的帧中实时识别它们 我想要这个适用于 android 设备的应用程序
所以我为此目的使用了 opencv 和 c++。
我尝试过的方法是

  • 首先我使用 sift、surf 和 orb 来获取关键点并将它们与卡片的静态图片进行比较
  • 第二种方法是k最近邻。我训练一些图片并制作两个xml文件,其中一个包含二进制模式下所有训练图像的像素,另一个是分类文件,它是训练图像的映射。

第一种方法有一个问题,即关键点可以实时变化并且不是唯一的。 所以匹配关键点不好。
第二种方法的问题是android设备中的xml文件加载时间过长。
所以现在我需要帮助
有什么快速可靠的方法吗?我该怎么办?

【问题讨论】:

  • 您可以使用tesseract 吗?
  • 不,我没有使用它,因为在示例中它在实时应用中并不精确。
  • 您是否尝试将这些字母或数字的轮廓保存为数组,然后使用 matchshape 函数在大图像中查找这些轮廓。这可以通过支持其他 opencv 函数来提供高速和良好的结果
  • 是的,我正在处理这个问题。谢谢推荐。
  • 如果您对这些步骤有一些问题,您可以提出一个新问题,我可能会帮助您。祝你好运!!!

标签: android c++ opencv image-processing object-recognition


【解决方案1】:

我终于找到了一种检测 May 卡片中字母的方法
为了识别卡片中的字母,我使用胡时刻
这有点像匹配形状,但更准确
https://www.learnopencv.com/shape-matching-using-hu-moments-c-python/
下面的代码重新运行一个双精度图像,这是两个图像之间的不同
所以我使用不同的并将其与其他图像进行比较,然后识别图像中的字母。

double HuMatchingShape(double*  secondMoments,double* firstMoments)
{
    double dif = 0;
    int counter = 0;
    for (int i = 0; i < 7; i++)
    {
        dif += (firstMoments[i] - secondMoments[i]) * (firstMoments[i] -secondMoments[i]);
    }
    return sqrt(dif);
}

double* getHuMoments(Mat img)
{
    Moments moments = cv::moments(img,true);

    // Calculate Hu Moments
    double * huMoments =  new double[7];

    HuMoments(moments, huMoments);
    for (int i = 0; i < 7; i++)
    {
        huMoments[i] = -1 * copysign(1.0, huMoments[i]) * log10(abs(huMoments[i]));
    }

    return huMoments;
}

int main()
{
   Mat image1 = imread("image path");
   Mat image2 =  imread("second image path");
   // make these two images binary 
   image1 = makeItBinay(image1);
   image2 = makeItBinay(image2);
   // calculate different between two image with hu moments 
   double different = HuMatchingShape(getHuMoments(image1), getHuMoments(image2));
   return 0;
}

【讨论】:

    猜你喜欢
    • 2013-01-23
    • 2011-07-21
    • 2012-06-05
    • 2019-07-13
    • 2012-01-25
    相关资源
    最近更新 更多