안 드 로 이 드 엔 드 는 openCV 를 사용 하여 자동차 번호판 검 사 를 실현 합 니 다.
5883 단어 androidopenCV자동차 번호판 검사
openCV 는 컴퓨터 시각 라 이브 러 리 를 열 고 컴퓨터 시각 과 기계 학습 을 바탕 으로 강력 한 이미지 처리 능력 을 제공한다.우 리 는 openCV 라 이브 러 리 를 안 드 로 이 드 엔 드 로 빠르게 통합 할 수 있 습 니 다.그 중 하 나 는 openCV Manager 를 직접 설치 하고 필요 에 따라 서 비 스 를 시작 하여 동적 으로 불 러 오 는 것 입 니 다.이렇게 하면 초기 설정 이 더욱 간단 하지만 APK 를 따로 설치 해 야 한다.나 는 의존 하 는 module 과 동적/정적 라 이브 러 리 를 모두 Project 로 가 져 오 는 다른 방식 을 선 호한 다.구체 적 인 절 차 는 다음 과 같다.
1.모듈 가 져 오기
먼저 홈 페이지 에서 openCVForAndroid 의 sdk 를 다운로드 하고 3.2.0 버 전 을 예 로 들 어 라 이브 러 리 에 의존 하 는 경 로 를 찾 은 다음 module 을 가 져 옵 니 다.
2.동적 및 정적 라 이브 러 리 가 져 오기
sdk 에서 lib 디 렉 터 리 를 찾 아 모든.a 와.so 파일 을 프로젝트 의 libs 에 대응 하 는 ABI 경로 로 복사 합 니 다.
3.gradle 설정
의존 하 는 정적 라 이브 러 리 를 native-libs 에 컴 파일 합 니 다:
task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
destinationDir file("$buildDir/native-libs")
baseName 'native-libs'
from fileTree(dir: 'libs', include: '**/*.so')
into 'lib/'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
......
}
자,3 단계 곡 을 설정 하면 openCV 를 즐겁게 사용 할 수 있 습 니 다.중간휴식
다음은 세 단계 곡 을 호출 합 니 다.openCV 를 불 러 오고 자동차 번호판 감지 기 를 초기 화하 고 자동차 번호판 검 사 를 수행 합 니 다.
1.openCV 불 러 오기
openCVLoader 를 불 러 옵 니 다.불 러 오 는 데 성공 하면 다음 작업 을 수행 합 니 다:
private void initOpenCV(){
boolean result = OpenCVLoader.initDebug();
if(result){
Log.i(TAG, "initOpenCV success...");
//
mPlateDetector = new ObjectDetector(this, R.raw.haarcascade_license_plate,
3, new Scalar(255, 0, 0, 0));
mObject = new MatOfRect();
}else {
Log.e(TAG, "initOpenCV fail...");
}
}
2.검 측 기 초기 화자동차 번호판 에서 검 측 된 직렬 분류 xml 파일 을 사용 하여 초기 화 합 니 다.
/**
*
* @param context
* @param id ID
* @return
*/
private CascadeClassifier createDetector(Context context, int id) {
CascadeClassifier javaDetector;
InputStream is = null;
FileOutputStream os = null;
try {
is = context.getResources().openRawResource(id);
File cascadeDir = context.getDir(LICENSE_PLATE_MODEL, Context.MODE_PRIVATE);
File cascadeFile = new File(cascadeDir, id + ".xml");
os = new FileOutputStream(cascadeFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
javaDetector = new CascadeClassifier(cascadeFile.getAbsolutePath());
if (javaDetector.empty()) {
javaDetector = null;
}
boolean delete = cascadeDir.delete();
Log.i("ObjectDetector", "deleteResult=" + delete);
return javaDetector;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
try {
if (null != is) {
is.close();
}
if (null != os) {
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.자동차 번호판 검 측 수행openCV 작업 대상 이 Mat 이기 때문에 우 리 는 Bitmap 를 Mat 로 바 꾼 다음 에 Gray 그 레이스 케 일 로 전환 하여 검 측 해 야 합 니 다.
/**
*
* @param bitmap bitmap
* @return bitmap
*/
private Bitmap doPlateDetecting(Bitmap bitmap){
if(mPlateDetector != null && bitmap != null){
Mat mRgba = new Mat();
Mat mGray = new Mat();
//bitmap map
Utils.bitmapToMat(bitmap, mRgba);
//rgba
Imgproc.cvtColor(mRgba, mGray, Imgproc.COLOR_RGBA2GRAY);
//
Rect[] object = mPlateDetector.detectObject(mGray, mObject);
if(object != null && object.length > 0){
//
Rect rect = object[0];
//
Imgproc.rectangle(mRgba, rect.tl(), rect.br(), mPlateDetector.getRectColor(), 3);
}
//mat bitmap
Utils.matToBitmap(mRgba, bitmap);
}
return bitmap;
}
그 중에서 detectObject 방법 체 는 캐 스 케 이 드 Classifier 의 detectMultiScale 을 호출 하여 검 측 을 완성 합 니 다.
public Rect[] detectObject(Mat gray, MatOfRect object) {
mCascadeClassifier.detectMultiScale(
gray, //
object, //
1.1, // ,
mMinNeighbors, // 3
Objdetect.CASCADE_SCALE_IMAGE,
getSize(gray, 80), //
getSize(gray, 800)); //
return object.toArray();
}
이렇게 오랫동안 고생 했 으 니,우리 에 게 자동차 번호판 검사 결 과 를 보 여 주세요.위의 번호판 은 거의 수평 인 데,그렇다면 기울어 진 번호판 은 감지 할 수 있 을 까?진실 은 바로 아래 에 있다.
각도 가 기울어 진 번호판 도 검출 할 수 있 지만 후기 번호판 인식 은 경사 교정 이 필요 하 다.정적 검 측 이 아직 재미 가 없다 면 동적 검 측 효 과 를 보 세 요.
다음 블 로 그 는 여러분 과 함께 자동차 번호판 인식 에 대해 논의 할 예정 이 니 기대 해 주세요.openCV 와 이미지 처 리 를 사랑 하 는 친구 들 이 조언 을 해 주 고 서로 공부 하 는 것 을 환영 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.