使用 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
坐标。
我目前正在使用 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
坐标。