Programming/Android

[안드로이드] OpenCV샘플소스 - CameraControl

devssun 2017. 3. 9. 23:59
728x90
반응형



기초적인 환경세팅은 이쯤하고 이제 문자인식 작업을 들어가려고한다


일단 정리한 결과 가장 좋은 문자인식 결과를 추출하기 위해 단순히 OCR만 하는 것이 아니라

명함 인식처럼 사진에서 각 과정을 거쳐 문자를 추출하기 좋은 환경을 구성하고 OCR을 할 예정이다.


일단 파이썬으로 하는 것은 잠시 보류하고 OpenCV 샘플 소스로 카메라를 띄우는 작업을 하고 있다.

이미 Preview를 띄우는 소스는 있기 때문에 소스 분석과 나에게 맞게 수정 작업을 하고 있다.



샘플소스는 이곳에

http://opencv.org



먼저 이 카메라뷰는 액티비티 1개, 카메라뷰 1개, xml 한개로 이루어져 있다.


CameraPreview.java : 효과 리스트, 화면 사이즈, 파일 입출력 메소드 등이 정의 되어있다.

CameraActivity.java : 화면 초기화 및 표시, 메뉴 생성, 파일명 생성 등의 메소드 등이 있다.

camera_view.xml : CameraView의 View를 화면으로 정의하고 사진 촬영 버튼을 두었다.


카메라 기능을 사용하기 위해서는 퍼미션 허용이 필요하기 때문에 AndroidMenifest.xml에서 설정을 한다.

또한 사진 파일 저장을 위해 내부 저장소 접근 권한도 필요하다



supports-screens 항목은 구글링하면서 찾게 된 것인데 다양한 사이즈의 화면을 갖춘 디스플레이에 맞춰

화면 사이즈를 조절해준다고 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
 
<!-- 다양한 사이즈의 하드웨어에 맞춰 화면 사이즈를 조절해주는 부분-->
    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true" />
 
 
cs


처음에 이 앱을 실행하면 센서의 방향과 화면이 맞지 않는 것을 확인할 수 있는데
원래 setDisplayOrientation(90)함수를 이용하면 변경이 가능한데 잘 되지않는다..
찾아보니 매니페스트에서 설정할 수 있다고 한다. 원래 세로화면으로 뜨게 하려고했는데
일단 가로모드로 해놓았다.

아래 화면의 왼쪽은 원래 뜨는 것이고 오른쪽이 변경 후 디바이스를 세로로 돌린 모습이다.
왼쪽 화면에서는 90도정도 조정을 하면 되는데 잘 적용이 되지않는다.

    

  



세로모드일 때 버튼 위치를 유동적으로 움직일 수 있다면 더 좋을 것 같다.

android:screenOrientation="landscape"





- CameraActivity.java

이 곳에서는 원래 CameraView가 터치된 순간 takePicture()를 실행시키는데

버튼을 사용하여 사진을 찍기위해 View.OnClickListener를 implements하고

Onclick()를 만들어 OnTouch()메소드에 정의된 것을 옮겼다.


1
2
3
4
5
6
7
8
9
10
11
12
// 버튼 클릭 시 오늘 날짜로 파일명 설정 후 사진찍는 함수 실행
    @SuppressLint("SimpleDateFormat")
    @Override
    public void onClick(View v) {
        Log.i(TAG,"onTouch event");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
        String currentDateandTime = sdf.format(new Date());
        String fileName = Environment.getExternalStorageDirectory().getPath() +
                "/sample_picture_" + currentDateandTime + ".jpg";
        mOpenCvCameraView.takePicture(fileName);
        Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT).show();
    }
cs





또 카메라를 찍을 때 상태바가 있으면 방해가 되기 때문에 FULL_SCREEN 모드를 정의하였다.

처음엔 매니페스트에서 하라길래 하는데 FULL어쩌구가 아예 나오지않았다.

근데 가까운 곳에 있었다 !!! 이거하면 상태바, 툴바가 나오지않아 깔끔한 화면을 확인할 수 있다.


getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);


기타 있는 함수는 CameraView에서 받은 효과 리스트 변수가지고 옵션메뉴를 생성하고 표시한다.

근데 이것은 일단 내 App에서는 뜨지않는다. 또 내가 하는거에선 필요가없기때문에 지워도 될 것 같다.

효과리스트가 뭔지 로그를 찍어봐야겠다.


초기화, 생명주기 함수 등등이 있다. 효과부분을 제외하면 소스가 어려운 것은 아니다


지금 카메라로 출력하고 찍는 것 까진되는데 사진 저장에서 openCV오류가 발생한다.


OpenCV error: Cannot load info library for OpenCV


이 오류인데 어플도 잘 설치되어있는데 왜 뜨는 지는 모르겠으나 더 찾아봐야겠다..

오늘은 여기까지..



파이썬 소스를 서버에서 실행시키는 것이 좋을 지 고민중..

반응형