gpt4 book ai didi

c++ - 检测所有符头,无论是全音符还是半音符

转载 作者:行者123 更新时间:2023-11-28 00:07:55 26 4
gpt4 key购买 nike

我需要检测 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);

}

最佳答案

实际上,我现在没有 openCV。但我尝试在短时间内在 matlab 中解决这个问题。首先,in this image你会发现音符的头部比五线谱更暗。当我们深入其中时,我们会看到音符的中心有 0 值 in this image .我建议你可以将你的 RGB 图像转换为灰度图像,然后可以应用阈值。如果像素值等于 0,那么你应该得到它们,但如果不是,你就得不到它们。其结果是这里in this image .然后,我认为你可以应用一些形态学操作,比如膨胀。因为检测到的音符头会比原来的小一点。如果你想消除音符的上侧(我的意思是音符的粘贴部分)你可以用霍夫线变换来检测这部分,opencv有这个操作的功能(HoughLines或houghLinesP)。检测后你可以删除这部分或者如果你不想,你可以通过这一步。毕竟你可以通过霍夫变换在图像上找到圆形对象。HoughCircles函数在opencv中执行此任务。在Matlab中使用 findcircles 函数会更容易一些。最后,您可以在 opencv 中使用 circle 函数或在 matlab 中使用 viscircles 函数绘制已建立的圆。结果为 here

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

关于c++ - 检测所有符头,无论是全音符还是半音符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34495549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com