opencv 24

자동 2진화 - OTSU

오브젝트 분석을 위해서는 그레이 이미지로 변화한 후 2진화를 통해 바이너리 이미지로 만들어야 한다.보통 바이너리 이미지는 이미지 헤더에 Index 0, 255 를 만들고 0과 1로 표현하지만, OpenCV에서는 헤더없이 0(Black)과 255(White) 로 표현한다. 2진화 방법의 Threshold 값으로는 크게 3가지가 있다.1. (전체대상) 고정값2. (전체대상) 자동으로 분리값 계산 후 분리3. 전체를 작은 블럭으로 나눈 후 고정값이나, 평균, 자동으로 Threshold를 계산 그중 자동 2진화 방법인 OTSU 에 대해 알아보자.일본인 大津(OOTSU) 박사에 의해 1979년 발표되었는데 간단히 설명하면 두 산봉오리(배경과 전경) 사이의 계곡을 찾는 원리이다.double getOtsuThres..

opencv 2026.02.26

Color -> Gray 변환방법

칼라 이미지를 그레이스케일 이미지로 변환하는 기본적인 방법은1. 화일을 읽어 들일때 명시적 파라미터(=0)로 지정 cv::Mat gray = cv::imread("이미지 화일 패스", 0); 2. cv::cvtColor 함수로 변환 cv::cvtColor(color, gray, cv::COLOR_BGR2GRAY); ※ OpenCV 의 Mat내의 1픽셀의 칼라 배치는 BMP포맷과 같이 BGR 입니다. RGB가 아닌 이유는 90년대 BMP를 마이크로소프트가 고안을 했고 당시 Windows는 Intel CPU를 채용했기 때문에 Intel CPU의 읽고 쓰기 특성이 Little Endian 방식으로 비트의 배열 시작이 오른쪽에서 왼쪽으로의 방향이였기 때문에 R이 오른쪽에 오고 B가 왼쪽에 배치되..

opencv 2026.02.26

Color Transform

이미지의 각 픽셀에 들어있는 R, G, B 값을 새로운 R′, G′, B′ 값으로 변환하려면 Color Transform(색 변환) 기법을 고려할 수 있습니다.OpenCV는 내부적으로 BGR 순서를 사용하므로 예제를 읽을 때 채널 순서에 주의하세요.예시(스캔된 채널의 최대값이 다음과 같을 때 — OpenCV 배열은 BGR 순서):R 채널 최댓값 = (10, 10, 230) G 채널 최댓값 = (10, 230, 10) B 채널 최댓값 = (230, 10, 10) 목표: 스펙트럼(명도·색분포)을 넓혀 대비를 개선하고 싶다면, 각 채널의 타겟 값을 다음처럼 조정할 수 있습니다.목표 R = (1, 1, 250) 목표 G = (1, 250, 1) 목표 B = (250, 1, 1) 이렇게 채널별로 값을 재배치..

opencv 2025.10.30

findContours 의 CV_RETR_TREE 옵션과 hierarchy 의 관계

findContours 의 옵션에 CV_RETR_EXTERNAL 을 적용하면 아래와 같이 붉은 선 좌표를 추출한다. 하얀 사각형 안에 들어 있는 검정 사각형의 좌표도 필요로 할 경우가 있다. 필자는 결함 검사 프로그램에서 하얀 부분은 검사 영역, 검은 부분은 비 검사 영역으로 비주얼로 보여줄 필요가 있어서 모든 좌표가 필요했다. 이럴 경우 findContours 의 옵션에 CV_RETR_TREE 를 넣어 추출해 보자.cv::Mat bw = cv::imread(".....");std::vector> contours;std::vector hierarchy;cv::findContours(image_mask_inverse, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPRO..

opencv 2025.06.26

findContours 의 결과 포인트들을 좀 더 심플하게 가공

오른쪽으로 3.5 도 기울어짐 B/W 이미지 이 기울어진 물체의 외곽 좌표들을 아래와 같이 findContours 를 이용하여 추출 할 수 있다.cv::Mat bw = cv::imread("..... ");std::vector> contours;std::vector hierarchy;cv::findContours( bw , contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); 하지만 기울림으로 인하여 인위적인 계단이 생겼기 때문에 이 경우에는 196 포인트의 좌표가 추출 된다. 이 계단 형태의 좌표들을 상쇄하여 심플한 직선 좌표를 얻고자 한다면 approxPolyDP 를 이용하여 contours 결과값을 가공하자.std::vector> appr..

opencv 2025.06.25

Barcode 읽기

일과 관련해서 이미지 중의 Barcode를 자동으로 찾아내서 디코딩하는 라이브러리를 조사해 보았다. *Windows VC++환경(어디까지나 가지고 있는 특정 이미지를 사용)라이브러리결과참고OpenCV (cv::barcode::BarcodeDetector)위치 특정 불가VER 4.80 이상 필요zbar 같은 바코드영역들을  하나로 묶어서 결과 출력 x64 버젼이 필요ZXing같은 바코드영역들이 수평으로 존재하지 않는 한 각각 다른 결과로 출력다운로드  결국 ZXing 을 선택하게 되었다. #include #include "opencv2/opencv.hpp"#include "ReadBarcode.h"#include "BarcodeFormat.h"int main(int argc, char** argv){  ..

opencv 2025.02.23

close contours (convexHull 사용)

과제findContours 에 RETR_EXTERNAL 옵션을 주면 가장 외곽의 연결된 선의 좌표들을 추출하는데, 만약 그 외곽선의 일부가 약한 픽셀로 되어 있다면 결과는 봉쇄되지 않은 contour로 인해 안쪽의 contour 좌표들도 결과로 추출되게 된다.결과적으로 가장 외곽의 contour만 추출하고자 한다.  아이디어모든 contour의 포인터들을 하나의 벡터에 집어넣고 그 벡터를 convexHull 로 처리하면 외곽에 완만한 곡선의 결과 포인트들만 얻을 수 있다.처리속도를 고려한다면 모든 포인트들을 전부 벡터에 넣을 필요는 없고 간격을 두고 처리하는 것도 좋은 아이디어이다.※ convexHull 과 approxPolyDP 의 차이점은 approxPolyDP 가 모든 contour 포인트들 대상으..

opencv 2025.02.16

스캔 이미지 중 여러 영수증 분리하기

과제아래와 같이 영수증을 모아 스캔한 이미지가 있고 영수증 영역을 각각 분리하고자 한다. 아이디어1. 위에 4장은 세로로 길고 아래 한장은 옆으로 눕혀있다.2. 위의 4장은 세로이므로 흑백 이미지로 변환한 후 세로로 길게 (3 x 40) 모펄러지 필터를 적용하자3. 2의 필터로 문자들간에 거리가 40픽셀 이하는 하나로 묶여지게 되었고 큰 덩어리로 서로 분리 되었다.    큰 틀안에 독립된 덩어리들도 존재하지만 5번에서 처리.4. findContours 실시하여 먼저 덩어리의 면적 순으로 내림정렬를 시킨다. 5. 작은 덩어리들은 큰 덩어리 내 혹은 겹치지 않는지 조사하여 합체 시키고, 외에 존재하는 덩어리들은 한 묶음으로 하기 위해 시작점과 끝점을 벡터에 등록한다.6. 큰 덩어리는 빨간색으로 작은 덩어리들..

opencv 2025.02.15

자동차 번호판 추출하기

아이디어1. 흑백으로 변환하여 contour 를 실시2. approxPolyDP로 contour 결과로 부터 꼭지점이 4개(4개의 코너)인 것 중 가장 면적이 넓은 contour를 기억approxPolyDP 알고리즘은 정확한 형태를 추출하는게 아니라 contours를 간단화 하는 것이다.contour의 형태에 적게 공헌하는 포인트들은 제거되고 형태에 공헌을 많이 하는 코너들은 남게 되는 것이다.옵션의 epsilon 은 작을수록 제거되는 포인트들은 줄게되고 큰값 일수록 많은 포인트들이 제거되어 간단화가 크게 이루워 진다.3. boundingRect 로 사각형의 좌표와 사이즈를 추출 주의) 노이즈가 심한 경우 contour결과에 영향을 줄 수 있으니 필터링에 신경을 더 써야 할 경우가 있다.번호판 보다 더 ..

opencv 2025.02.15

Color를 Grayscale 로 변환 (커스텀 비율)

칼라 이미지를 그레이스케일로 변환시에 OpenCV는 아래 함수를 사용한다.cv::cvtColor(color, gray, cv::COLOR_BGR2GRAY); 위의 함수는 표준 변환 비율( 0.299 ∙ Red + 0.587 ∙ Green + 0.114 ∙ Blue) 을 사용한다. 이는 인간의 눈에는 Green이 민감하게 반응하기 때문에 제일 반영 비율이 높다. 하지만 필요에 따라서는 똑같은 비율을 사용하고자 할 때가 있을 것이며 아래의 함수를 사용하면 간단히 적용 가능하다.단, 위의 함수에 비해 속도는 상당히 느려진다.cv::transform(color, gray, cv::Matx13f(0.333, 0.333, 0.333));처리 시간 테스트사용 이미지: 17500 x 12812  Pixels (224...

opencv 2025.02.14