我目前正在使用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;