안 드 로 이 드 엔 드 는 openCV 를 사용 하여 자동차 번호판 검 사 를 실현 합 니 다.

지금 은 자동차의 종적 이 없 는 곳 이 없고 도로 가 질주 하 며 거리 가 멈 추고 동네 가 멈 추 며 차고 가 정박 하고 있다.이렇게 많은 양의 자동 차 를 관리 하고 감시 하 는 것 은 골 치 아 픈 문제 다.똑똑 한 사람들 은 자동차 번호판 이 자동차의 신분증 이기 때문에 자동차 번호판 에 눈 을 돌 렸 다.그래서 자동차 번호판 인식 이 초점 이 되 었 고 자동차 번호판 검 사 는 자동차 번호판 인식 의 기초 와 전제 이다.이 글 은 주로 openCV 를 이용 하여 자동차 번호판 검 사 를 실현 하 는 것 을 토론 한다.
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 와 이미지 처 리 를 사랑 하 는 친구 들 이 조언 을 해 주 고 서로 공부 하 는 것 을 환영 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기