【问题标题】:Is there a way to detect a hollow circle in the middle?有没有办法检测中间的空心圆?
【发布时间】:2016-04-04 13:39:14
【问题描述】:

我正在尝试检测全音符和半音符,但对于半音符,我似乎无法检测到它,因为它是一个空心圆圈。有没有办法检测空心圆?

示例

这是我的代码:

#include "opencv2/opencv.hpp"

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{

    // Read image
    Mat im = imread("beethoven_ode_to_joy.jpg", IMREAD_GRAYSCALE);

    // Setup SimpleBlobDetector parameters.
    SimpleBlobDetector::Params params;

    // Change thresholds
    params.minThreshold = 10;
    params.maxThreshold = 200;

    // Filter by Area.
    params.filterByArea = true;
    params.minArea = 15;

    // Filter by Circularity
    params.filterByCircularity = true;
    params.minCircularity = 0.1;

    // Filter by Convexity
    params.filterByConvexity = true;
    params.minConvexity = 0.01;

    // Filter by Inertia
    params.filterByInertia = true;
    params.minInertiaRatio = 0.01;


    // Storage for blobs
    vector<KeyPoint> keypoints;


#if CV_MAJOR_VERSION < 3   // If you are using OpenCV 2

    // Set up detector with params
    SimpleBlobDetector detector(params);

    // Detect blobs
    detector.detect(im, keypoints);
#else 

    // Set up detector with params
    Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);

    // Detect blobs
    detector->detect(im, keypoints);
#endif 

    // Draw detected blobs as red circles.
    // DrawMatchesFlags::DRAW_RICH_KEYPOINTS flag ensures
    // the size of the circle corresponds to the size of blob

    Mat im_with_keypoints;
    drawKeypoints(im, keypoints, im_with_keypoints, Scalar(0, 0, 255), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

    // Show blobs
    imshow("keypoints", im_with_keypoints);
    imwrite("a.jpg", im_with_keypoints);
    waitKey(0);

}

【问题讨论】:

  • 请发布您的代码。
  • 有很多方法可以做到这一点,但它确实取决于上下文,即代码将在哪里运行(服务器、仅浏览器、桌面应用程序)你想要什么编程语言使用,等等,等等。但总之是可以做到的。
  • 将使用的编程语言是 c++ with opencv
  • 有没有办法在不使用模板匹配的情况下检测空心圆?
  • 您是否尝试过任何机器学习算法来解决您的问题?

标签: opencv image-processing machine-learning computer-vision


【解决方案1】:

我给你的建议是使用一些机器学习算法。简而言之,整个想法如下:您首先需要为图像创建一个训练集。在训练集中,您需要标记一些东西。一个标签是“空心圆”。然后你标记其他笔记。我不知道有多少个音符,但是您可以将每个音符单独标记,或者将所有不是神圣圆圈的音符标记为一个。您也可以标记背景。然后,您在训练数据上训练机器学习模型,然后将您的测试数据(模型在训练时未看到的图像)输入其中并获得准确性。您可以将数据拆分为training and validation sets 进行训练。

对于标签,您可以使用this website

【讨论】:

    【解决方案2】:

    有不同的方法可以做到这一点。这是一个简单的:

    • 首先(可选),我会使用霍夫变换来检测分区,而不是音符,因为处理更简单的图像通常更容易。您确切地知道必须找到的垂直/水平线的数量,因此很容易对 Hough 变换进行参数化。如果您的图像被完美扫描,您还可以使用直方图投影(也称为积分投影功能)。
    • 由于有些笔记没有完全填满,我会先做一个小填充孔操作(see herehere)。也可以使用关闭来完成。如果你不这样做,你只分割整个笔记(见下面的结果)。
    • 现在,您执行一个小开头,它只会保留键和音符。

    结果:

    • Opening result 没有填充。
    • Filling result
    • Final result(填充+开口)。还不完美,但非常接近最终解决方案,特别是如果您先应用霍夫变换,然后在下面应用我的评论。

    一般评论:不要使用 JPG 格式,它会添加很多伪影,这在图像处理中尤其令人讨厌,尤其是在您进行如此微小的图案检测时。

    【讨论】:

    • 我有一个代码,但它只能检测一个圆圈,它不能检测一个空心圆圈
    • 我使用的操作/算法应该在 OpenCV 中可用
    • blob检测能检测到空心圆吗?
    • 可能。但我主要使用 OpenCV 中存在的 Open/Close。
    • 查看我附上的图片!结果并不完美,但与您想要的非常接近!
    【解决方案3】:

    模板匹配可能很笼统,我不知道你的意思。

    空心圆就是我们所说的圆。

    所以我的第一个建议是使用霍夫变换(你的圆圈是否变成椭圆是有问题的,你可以看到)。

    由于您的圈子大小相同,因此您可以通过霍夫变换获得成功 - 了解一下

    【讨论】:

    • 但是我需要检测空心圆,另一方面我已经可以检测到一个正常的圆。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多