본문으로 바로가기

안녕하세요!! 이번에는 안드로이드에서 구글 Cloud Vision API 사용법을 알아보겠습니다.




구글 Cloud Vision API은 이미지에서 얼굴인식, 랜드마크탐지, 사물감지, 텍스트 인식, 로고, 부적절한 이미지 감지 등 다양한 기능이 있습니다.


자세한 내용은 구글 클라우드 플렛폼 내의 클라우드비전을 참고해주세요!!

https://cloud.google.com/vision/


그럼 이제부터 Cloud Vision API를 안드로이드에서 사용해 보도록 하겠습니다.


오늘은 여러 기능중 text 인식기능에대해 알아보겠습니다.


Cloud Vision API를 안드로이드에서 사용하기에 앞서 구글 클라우드 플렛폼에서 API키를 발급받아야 합니다.

(API키 발급 방법은 추후에 올리겠습니다)


먼저 클라우드비전 API의 샘플 소스입니다 GItHub에서 참고해주세요 .

https://github.com/GoogleCloudPlatform/cloud-vision


클라우드비전은 인터넷과 이미지를 가져오기위해 카메라와 앨범의 권한이 필요합니다. 따라서 manifests 에 권한을 부여합시다.

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>

자바 파일로는 Main 과 PackageManagerUtils.java,PermissionUtils.java 이렇게 세개가 있습니다.


우리는 Main만 보면됩니다.


public class MainActivity extends AppCompatActivity {
    private static final String CLOUD_VISION_API_KEY = "YOUR_API_KEY";
    public static final String FILE_NAME = "temp.jpg";
    private static final String ANDROID_CERT_HEADER = "X-Android-Cert";
    private static final String ANDROID_PACKAGE_HEADER = "X-Android-Package";
 
    private static final String TAG = MainActivity.class.getSimpleName();
    private static final int GALLERY_PERMISSIONS_REQUEST = 0;
    private static final int GALLERY_IMAGE_REQUEST = 1;
    public static final int CAMERA_PERMISSIONS_REQUEST = 2;
    public static final int CAMERA_IMAGE_REQUEST = 3;
...
메인이 시작하는 부분입니다 CLOUD_VISION_API_KEY = "YOUR_API_KEY"; 부분에 발급받은 API키를 넣어주세요.

 
다음으로 private void callCloudVision(final Bitmap bitmap) 메소드를 살펴보겠습니다.

 callCloudVision 메소드 안에 
annotateImageRequest.setFeatures(new ArrayList<feature>() {{
                            Feature labelDetection = new Feature();
                            labelDetection.setType("LABEL_DETECTION");
                            labelDetection.setMaxResults(10);
                            add(labelDetection);
                        }});

이부분에서 labelDetection.setType("LABEL_DETECTION");  클라우드 비전이 어떤 기능을 사용할지 알려줍니다. 예제는 LABEL_DETECTION 으로 이미지에대한 정보를 알려줍니다 .


LABEL 뿐만아니라 텍스트, 랜드마크, 로고 등 여러가지 키워드가 있습니다.


예를들어 텍스트 인식기능을 사용하고 싶은경우

    annotateImageRequest.setFeatures(new ArrayList<feature>() {{
                            Feature textDetection = new Feature();
                            textDetection.setType("TEXT_DETECTION");
                            textDetection.setMaxResults(10);
                            add(textDetection);
                        }});
추가해주시면 되겠습니다. 

다음으로 출력 부분입니다 이미지를 분석을한뒤 안드로이드 xml 에 띄워주기위한 부분입니다.

private String convertResponseToString(BatchAnnotateImagesResponse response) 메소드 안에서
String message = "I found these things:\n\n";
 
        List<entityannotation> labels = response.getResponses().get(0).getLabelAnnotations();
        if (labels != null) {
            for (EntityAnnotation label : labels) {
                message  = String.format(Locale.US, "%.3f: %s", label.getScore(), label.getDescription());
                message  = "\n";
            }
        } else {
            message  = "nothing";
        }
 
        return message;
    }
message 를 리턴해줍니다 이 리턴값이 사용자 xml 의 텍스트뷰에 띄워지게 됩니다. 위 예제는 label 을 받아오는 부분입니다.

text 예제일경우
 String message = "I found these things:\n\n";
        List<entityannotation> labels = response.getResponses().get(0).getTextAnnotations();
        if (labels != null) {
            message  = labels.get(0).getDescription();
        } else {
            message  = "nothing";
        }
        return message;
    }
이렇게 리턴해줬습니다.

이렇게되면 callCloudVision 메소드 안의
protected void onPostExecute(String result) {
                mImageDetails.setText(result);
            }
부분에서 setText 하여 사용자의 xml 에 출력할수있습니다.

아래는 직접 만들어 실험해본 화면입니다.. 텍스트 인식이 100%까지는 아니라도 잘됩니다.

ps. 클라우드 플랫폼 홈페이지에서도 이용해볼수 있습니다.



댓글을 달아 주세요

  1. 익명 2017.11.09 19:33

    비밀댓글입니다

  2. 익명 2018.05.17 13:59

    비밀댓글입니다

  3. 익명 2018.06.02 19:28

    비밀댓글입니다

  4. ㅇㅇ 2019.01.14 02:20

    자네의 코드 잘 받아가겠네 -괴도 코팡-

  5. ㅇㅇ 2019.01.28 19:36

    @Override
    protected String doInBackground(Object... params) {
    try {
    Log.d(TAG, "created Cloud Vision request object, sending request");
    BatchAnnotateImagesResponse response = mRequest.execute();
    return convertResponseToString(response);

    } catch (GoogleJsonResponseException e) {
    Log.d(TAG, "failed to make API request because " + e.getContent());
    } catch (IOException e) {
    Log.d(TAG, "failed to make API request because of other IOException " +
    e.getMessage());
    }
    return "Cloud Vision API request failed. Check logs for details.";
    }

    이미지등록후 기다리니 위에 설정한것처럼 Cloud Vision API request failed. Check logs for details. 이런 메세지가 텍스트뷰에 나타나는데 혹시 해결방법이 있나요???