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

Any tips or tricks to recognize lines better using HAAR cascades?

我目前正在使用 OpenCV 开发 Android 用于光学音乐识别的应用程序。必须实时运行,不使用照片。我为工作人员创建了一个 HAAR 级联(5 条主线),但它非常慢(肯定低于 5 fps)并且不太准确。有没有更好的方法来做到这一点?问题是我需要它来识别这些线的全宽,但它却识别了里面的许多较小的线。

The real recognition is green, what I want is blue

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 Error: Unspecified error"。代码如下:

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?使用它,您将返回 vector<4i>,它存储每行的 x1, y1, x2 and y2 坐标。