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

时间:2017-04-21 16:53:35

标签: opencv camera image-recognition haar-classifier

我目前正在使用OpenCV开发一款用于光学音乐识别的Android应用程序。它必须实时运行,而不是使用照片。我为工作人员创建了一个HAAR级联(五条主线),但速度非常慢(当然低于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 ++实现一个Hough Lines Transform,但我一直得到“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;

1 个答案:

答案 0 :(得分:0)

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