我需要检测来自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);
}
答案 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变换来检测和擦除音符部分。如果你可以应用它们,我认为你会得到更好的结果。 这个算法只是一个建议,你可以通过尝试其他一些操作找到更好的算法。