检测所有音符头是整个音符还是半音符

时间:2015-12-28 14:41:12

标签: c++ opencv image-processing

我需要检测来自given image的所有全部和半个音符,并将所有检测到的音符打印到新图像中。但似乎代码没有检测到它只检测整个音符的半音符。

这是我的源代码

#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 = 25;

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

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

    // 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);
    waitKey(0);

}

1 个答案:

答案 0 :(得分:2)

实际上,我现在没有openCV。但是我试着在matlab中用短时间解决这个问题。首先,in this image你会发现笔记的头部比木板更暗。当我们得到更多在其中我们看到笔记的中心具有0值in this image。我建议你可以将你的RGB图像转换为灰度图像,之后可以应用阈值。如果像素值等于0就可以了,你应该得到它们但如果没有你就得不到它们。结果是在这里in this image。然后,我认为你可以应用一些形态学操作,如扩张。因为检测到的音符头会比原来的小一点。如果你想消除音符的上方(我的意思是指部分音符)你可以通过hough line变换检测到这个部分,opencv有这个操作的功能(HoughLines)或者houghLinesP)。检测完后你可以删除这个部分,或者你不想要,你可以通过这个步骤。毕竟,你可以通过hough transform在图像上找到圆形对象.HoughCircles函数在opencv中执行这个任务。在Matlab中使用findcircles函数稍微容易一点。最后,你可以在opencv中绘制带圆函数的圆形圆或在matlab中绘制viscircles函数。结果是here

请注意,我没有应用形态学操作来改善音符的大小。同时,我没有应用houghline变换来检测和擦除音符部分。如果你可以应用它们,我认为你会得到更好的结果。 这个算法只是一个建议,你可以通过尝试其他一些操作找到更好的算法。