이번 시간에는 OpenCV를 이용하여 관심역영(ROI)을 추출하겠습니다.

관심영역 추출은 문자인식 전처리 기법 중 하나로

인식 할 범위를 대폭 축소시켜 프로그램 전반적인 실행속도를 향상 시키고

인식률 또한 높일 수 있는 전처리 기법입니다.


※ 안드로이드와 OpenCV 연동은 이곳을 참고하세요.

※ SurfaceView와 카메라 연동은 이곳을 참고하세요.


동작 과정

1. SurfaceView에 카메라 화면 출력

2. 캡쳐를 누르면 안드로이드 내부 저장소에 사진이 저장

3. 새로운 액티비티가 실행되며 저장소에 저장된 사진을 불러옴

4. 불러온 사진을 흑백처리, 이진화처리 수행

5. 처리된 사진을 OpenCV 라이브러리 함수로 영역들을 추출해냄

6. 추출된 영역 중 자동차 번호판에 해당하는 영역만 표시

7. 표시된 영역을 따로 결과화면에 출력

8. 출력된 관심영역을 가지고 문자인식 수행



소스코드 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
List<MatOfPoint> contours = new ArrayList<>(); 
 
Mat hierarchy = new Mat();
 
Imgproc.findContours(imageCny1, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
 
 
for(int idx = 0; idx >= 0; idx = (int) hierarchy.get(0, idx)[0]) {
 
MatOfPoint matOfPoint = contours.get(idx);
 
Rect rect = Imgproc.boundingRect(matOfPoint);
 
if(rect.width < 30 || rect.height < 30 || rect.width <= rect.height || rect.x < 20 || rect.y < 20
 
|| rect.width <= rect.height * 3 || rect.width >= rect.height * 6continue// 사각형 크기에 따라 출력 여부 결정
 
 
 
// ROI 출력
 
Bitmap roi = Bitmap.createBitmap(myBitmap, (int)rect.tl().x, (int)rect.tl().y, rect.width, rect.height);
 
ImageView imageView1 = (ImageView)findViewById(R.id.image_result_ROI);
 
imageView1.setImageBitmap(roi);
 
}
 
 
image1= Bitmap.createBitmap(img1.cols(), img1.rows(), Bitmap.Config.ARGB_8888);
 
Utils.matToBitmap(img1, image1); // Mat to Bitmap
 
 
imageView = (ImageView)findViewById(R.id.image_result);
 
imageView.setImageBitmap(image1);
 
}
cs



실행화면 입니다.


  





정보가 유익하셨다면 아래 공감버튼 눌러주시면 감사하겠습니다.

질문사항은 댓글로 달아주시면 성의껏 답변해드리겠습니다.






to Top