[안드로이드로 배우는 OpenCV] 바운딩 트라이앵글 구하기

Prerequisite : 윤곽선 길이 구하기 바운딩 트라이앵글 바운딩 트라이앵글(삼각형)이란 윤곽선을 외접하여 둘러싸는 가장 작은 삼각형을 의미한다. OpenCV에서는 minEnclosingTriangle라는 함수를 통해 바운딩 트라이앵글을 구할 수 있다. Imgproc.minEnclosingTriangle(contour, triangle) contour: 윤곽선 좌표triangle: 함수 호출 후 참조할 삼각형 정보 (Mat타입) minEnclosingTriangle 함수를 이용하여 이미지 내 도형을 감싸는 예제를 살펴보자. 예제코드: val contours = ArrayList<MatOfPoint>() 더보기…

[안드로이드로 배우는 OpenCV] 최소 크기의 회전된 바운딩 박스 구하기

Prerequisite : 윤곽선 길이 구하기, 바운딩 박스 최소 크기의 회전된 바운딩 박스 바운딩 박스를 회전시켜 구할 수 있다면, 더 작은 사각형으로 도형을 감쌀수 있다. OpenCV에서는 회전된 바운딩 박스를 구하는데 minAreaRect() 함수를 제공한다. Imgproc.minAreaRect(contour) contour: 윤곽선 좌표반환값: RotatedRect 타입의 회전된 사각형 정보 minAreaRect 함수를 사용하여 최소 크기의 회전된 바운딩 박스를 구하는 더보기…

[안드로이드로 배우는 OpenCV] 바운딩 써클 구하기

Prerequisite : 윤곽선 길이 구하기 바운딩 써클 바운딩 써클이란 윤곽선을 외접하여 둘러싸는 가장 작은 원을 의미한다. OpenCV에서는 minEnclosingCircle이라는 함수를 통해 바운딩 써클를 구할 수 있다. Imgproc.minEnclosingCircle(contour, center, radius) contour: 윤곽선 좌표center: 함수 호출 후 참조 가능한 도형의 중심점radius: 함수 호출 후 참조 가능한 바운딩 서클 반지름 minEnclosingCircle 함수를 이용하여 이미지 더보기…

[안드로이드로 배우는 OpenCV] 바운딩 박스 구하기

Prerequisite : 윤곽선 길이 구하기 바운딩 박스 바운딩 박스란 윤곽선을 외접하여 둘러싸는 가장 작은 사각형을 의미한다. OpenCV에서는 boundingRect라는 함수를 통해 바운딩 박스를 구할 수 있다. Imgproc.boundingRect(contour) contour: 외곽선 정보(좌표)반환값: 사각형 정보(Rect);(x,y,w,h) 정보를 포함 boundingRect함수를 이용하여 이미지내의 도형을 감싸는 예제를 살펴보자. 예제 코드: val contours = ArrayList<MatOfPoint>() val hierarchy = Mat() 더보기…

[안드로이드로 배우는 OpenCV] 윤곽선을 감싸는 면적의 크기를 구하기

OpenCV에서 제공하는 함수를 통해 윤곽선이 감싸는 영역의 면적을 구하는 방법을 알아보자. 윤곽선을 감싸는 면적 구하기 Imgproc.contourArea(contour) contour : 윤곽선 정보(좌표)oriented(optional) : true면 윤곽선 진행 방향에 따라 부호 있는 면적을 반환. 기본값은 false반환값 : 윤곽선으로 구성된 영역의 면적 위 함수를 이용하여 이미지 내에 포함된 도형들의 면적(픽셀갯수)을 구하는 예제를 만들어보자. 예제 코드:

[안드로이드로 배우는 OpenCV] 윤곽선 길이 구하기

지난 포스팅에서 윤곽선 검출 함수 findContours() 를 통해 윤곽선을 검출하는 방법에 대해 알아보았다. 이 포스팅에서는 검출한 윤곽선 정보를 가지고 윤곽선의 길이를 구하는 함수에 대해서 알아본다. 윤곽선 길이 구하기 contour: 윤곽선 정보(좌표)closed: true면 폐곡선반환값: 윤곽선의 길이 arcLength 함수를 사용하는 가장 긴 외곽선만 검출하는 예제를 만들어보자. Tip : findContours 함수로 찾은 윤곽선들의 더보기…

Migrating to Jetpack Compose – 테스트 하기

식물 세부 정보 화면의 일부를 컴포즈로 마이그레이션한 후, 아무 것도 손상되지 않았는지 테스트하는 것이 중요하다. Note: 실제 앱에서는 테스트 없이 레거시 코드를 다시 작성해서는 안된다. 또한 코드를 컴포즈로 마이그레이션하는 동안 테스트를 리팩토링하고 패스(녹색) 할수 있도록 유지해야 한다. Sunflower에서 androidTest 폴더에 있는 PlantDetailFragmentTest는 앱의 일부 기능을 테스트한다. 파일을 열고 현재 코드를 더보기…

Migrating to Jetpack Compose – 테마 상호운용

컴포즈로 마이그레이션된 식물 세부 정보의 텍스트 콘텐츠가 있다. 그러나 컴포즈가 올바른 테마 색상을 사용하지 않는다는 것을 눈치챌 수 있다. 녹색을 사용해야 할 때 식물 이름에 보라색을 사용한다. 이 초기 마이그레이션 단계에서, 컴포즈에서 처음부터 Material 테마를 다시 작성하는 대신 View 시스템에서 사용 가능한 테마를 상속하기를 원할 수 있다. Material 테마는 컴포즈와 더보기…

Migrating to Jetpack Compose – ViewCompositionStrategy

기본적으로 컴포즈는 ComposeView가 윈도우에서 분리될 때마다 컴포지션을 삭제한다. 이런 부분은 ComposeView가 프레그먼트내에서 사용될 때 여러가지 이유로 바람직 하지않다. 컴포지션은 Compose UI 보기 타입이 상태를 저장하기 위해, 프래그먼트의 View 생명주기를 따라야 한다. 트랜지션 또는 윈도우 트랜지션이 발생할 때 Compose UI 요소를 화면에 유지한다는 것은, 전환하는 동안 ComposeView 자체는 윈도우에서 분리된 후에도 더보기…

Migrating to Jetpack Compose – 컴포즈 코드 내의 View

이제 식물 설명을 마이그레이션해 해보자. fragment_plant_detail.xml의 코드에는 화면에 표시할 텍스트를 XML에 알려주기 위해 app:renderHtml=”@{viewModel.plant.description}”이 있는 TextView가 있다. renderHtml은 PlantDetailBindingAdapters.kt 파일에서 찾을 수 있는 바인딩 어댑터다. 구현은 HtmlCompat.fromHtml을 사용하여 TextView의 텍스트를 설정한다. 그러나 컴포즈는 현재 Spanned 클래스를 지원하지 않고, HTML 형식의 텍스트를 표시하지 않는다. 따라서 이 한계를 우회하려면, 컴포즈 코드의 View 더보기…