使用HAAR级联更好地识别线条的任何提示或技巧?



我目前正在开发一个使用OpenCV的光学音乐识别Android应用程序。它必须实时运行,而不是使用照片。我为员工创建了一个 HAAR 级联(五条主线),但它非常慢(肯定低于 5 fps)而且不是那么准确。难道没有更好的方法吗?问题是我需要它来识别这些线条的全宽,但它可以识别内部的许多较小线条。

真正的认可是绿色的,我想要的是蓝色

C++代码:

String lines_cascade_name = "storage/emulated/0/data/haar_lines.xml";
CascadeClassifier lines_cascade;
std::vector<Rect> lines;
Mat frame_gray;
cvtColor( frame, frame_gray, CV_BGR2GRAY );
equalizeHist( frame_gray, frame_gray );
lines_cascade.detectMultiScale( frame_gray, lines, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
for( size_t i = 0; i < lines.size(); i++ ) {
rectangle(frame, lines[i].tl(), lines[i].br(), Scalar(0, 255, 0), 2, 8, 0);
Mat faceROI = frame_gray( lines[i] ); Scalar( 255, 0, 0 ), 4, 8, 0 );
}

我需要确定第一步,然后识别音符和其他符号,并计算它们在谱号上的位置,并在它们与中线相交时播放它们。

将预览转换为Canny不是更好吗,因为它只绘制线条和边缘?

如果您有任何想法,我将不胜感激。

编辑: 所以我正在尝试在C++中实现霍夫线转换,但我不断收到"OpenCV 错误:未指定的错误"。代码如下:

JNIEXPORT void JNICALL Java_com_ryu_musicreader_OpencvClass_musicDetection
(JNIEnv *, jclass, jlong addrRgba){
Mat& frame = *(Mat*)addrRgba;
find_lines(frame);
}
void find_lines(Mat& src){
Mat dst, cdst;
Canny(src, dst, 50, 200, 3);
cvtColor(dst, cdst, COLOR_GRAY2BGR);
vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
for( size_t i = 0; i < lines.size(); i++ )
{
Vec4i l = lines[i];
line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, 0);
}
imshow("detected lines", cdst);
}

包含的库在我的头文件中:

#include <jni.h>
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;

为什么不使用 Hough Line Transform?使用它,您将返回存储每行x1, y1, x2 and y2坐标vector<4i>

最新更新