opencv 21

contour / labelling

contour  는 모양의 외곽에 위치한 포인트들을 연결하는 커브를 의미한다. OpenCV 에서의 contour 는 크게 두가지 함수가 있다.findContours()    : 외곽선상의 포인트 좌표 수집drawContours()  :  수집된 좌표를 연결한 선긋기수집된 포인트 좌표로 구할 수 있는 것:무게중심moments()외곽선 안쪽의 면적contourArea()외곽선의 길이arcLength()간략한 외곽선approxPolyDP()울퉁불퉁 정도convexHull()울퉁불퉁 여부isContourConvex()외곽선을 내부에 포함한 사각형boundingRect()회전을 고려한 외곽선을 내부에 포함한 사각형사각형의 4코너 포인트minAreaRect()boxPoints()외곽선을 내부에 포함한 원minEnc..

opencv 2023.12.07

공백 메우기

왼쪽과 같은 b/w 이미지를 오른쪽과 같이 공백을 메우는 방법을 OpenCV로 알아보자.아울러 아래의 기법도 확실히 알아두기로 하자.findNonZero 함수를 이용한 흰픽셀의 좌표얻기convexHull 함수를 이용한 어바우트한 윤곽 포인트 획득 이미지를 그레이스케일 변환하여 읽어 들이고 10 을 기준으로 b/w 변환한다. cv::Mat inputImage = cv::imread("input.jpg", CV_LOAD_IMAGE_GRAYSCALE); cv::threshold(inputImage, inputImage, 10, 255, 0); b/w 이미지내에서 흰색픽셀의 좌표를 찾아내서 Mat 안에 보관cv::Mat nonZeroCoordinates; cv::findNonZero(inputImage, non..

opencv 2023.12.02

b/w 이미지의 칼럼(수직방향)별 검정(=0)픽셀수 카운트

이미지에 있어서 검은 테두리 부분을 제거 하는 등을 위해서는 각 로우별, 칼럼별로 검은 픽셀수를 카운트하여 어느 threshold 치 이상인 경우에는 처리하는 로직등의 경우에 아래 코드가 유용하게 사용할 수 있을 것 같다. 아래코드는 수직방향인 칼럼의 검정픽셀수를 계산한다. 각 로별의 검정픽셀수도 응용할 수 있으리라 본다. // GRAY인 경우에는 읽어들어 cv::threshold 로 이진화 할 필요가 있다. // 이하는 이미지 자체가 흑백만이 존재하는 가정으로 하자. cv::Mat1b img = cv::imread("img.png", CV_LOAD_IMAGE_GRAYSCALE); cv::Mat1i black_pixels(img.cols, 1); for(int x = 0; x < img.cols; x++..

opencv 2023.12.02

cv::Mat 이모저모

본론으로 들어가지 전에 C++ 기초가 부족하시는 분들이 있을 것 같아서 왜 앞에 cv:: 를 붙이나요? 라고 하면 opencv 의 라이브러리(dll)를 생성할 때 namespace cv { 코드 } 형식으로 만들었기 때문에 명시적으로 cv:: 를 적어주는 것이다. 만약 자신의 코드화일의 선언부에 using namespce cv; 를 선언해 주면 cv:: 를 생략해 줘도 상관없다. 하지만 라이브러리 간에 똑같은 함수를 사용하는 경우가 있고 코드를 알기 쉽게 하기 위해서 개인적으로는 cv:: 를 붙여서 코딩하는 것을 선호한다. 단순히 선언만 -> 이미지 공간은 할당되지 않고 클래스 변수만 스택에 저장 cv::Mat image; 이미지 공간 할당 넓이, 높이, 픽셀타입, (옵션)초기값 을 지정한 경우 - (1..

opencv 2023.11.29

이미지 회전

회전시(반시계 방향)의 변환 매트릭스는 아래와 같다.이 매트릭스가 되는 이유는 아래와 같이 삼각함수로 설명이 가능하다.x좌표(1, 0)를 θ만큼 회전을 시키면 삼각함수 cosθ = x' / 1 과 sinθ = x' / 1  에 의해 x' = cosθ, sinθ 가 된다.y좌표(0, 1)를 θ만큼 회전을 시키면 삼각함수 sinθ = y' / 1(음수값이므로 -) 과 cosθ = y' / 1  에 의해 y' = -sinθ, cosθ 가 된다.여기에 회전후 좌표 이동까지 고려한다면 아래와 같다. 이에 상응하는 OpenCV 함수는 아래와 같고  리턴하는 매트릭스는 위의 2 x 3 의 형태가 된다. 위의 매트릭스를 이미지에 적용하는 함수는 warpAffine() 이다. 1. 일반 회전 cv::Mat image =..

opencv 2023.11.27

스캔문서의 기울기 알아보기 - 2

스캔문서의 기울기 알아보기 에서 라인을 통해 기울기를 알아 보았다. 이번 칼럼에서는 단락을 통해 기울기를 알아보는 방법을 살펴보자. 그레이 변환 ▶ B/W 변환 ▶ 문자를 흰색으로 변환 ▶ 문자(흰픽셀) 좌표만 Point배열에 저장 ▶ minAreaRect 함수를 통해 각도 확인 ▶ 각도 보정 이번에 사용할 이미지는 지난번 이미지에서 단락 부분만 떼어 내었다. 만약 전체 이미지를 사용하고자 한다면 단락간의 공간을 찾아내어 한 단락만 떼어내는 로직이 필요할 것이다. 1. 그레이 변환, B/W 변환, 문자를 흰색으로 변환 cv::Mat image = cv::imread("d:\\image.png"); cv::cvtColor(image, image, cv::COLOR_BGR2GRAY); cv::threshol..

opencv 2023.11.27

스캔문서의 기울기 알아보기

기울어진 스캔문서 이미지(칼라)가 아래와 같이 있을 경우, 문자인식등을 위해서는 기울기 보정을 해주어야 한다. 이번 기울기 보정의 흐름은 아래와 같다. 그레이 변환 ▶ B/W 변환 ▶ 문자를 흰색으로 변환 ▶ 문자를 두텁게 ▶ 라인을 검출 ▶ 라인의 기울기 평균 1. 그레이 변환, B/W 변환 cv::cvtColor(image, image, cv::COLOR_BGR2GRAY); cv::threshold(image, image, 100, 255, cv::THRESH_BINARY); 노이즈가 없는 샘플을 사용했기 때문에 위와 같이 간단한 Threshold함수를 사용하였다. 질이 나쁜 이미지를 사용한다면 노이즈제거, otsu 나 adaptive threshold 함수등을 사용해야 할 것 이다. 2. 문자를 흰..

opencv 2023.11.26

(opencv) 이미지 저장형태, 액서스

1. opencv에 있어서 이미지는 어떻게 저장되어 있을까?프로그램이 실행될 때 사용되는 메모리는 여러 영역으로 구분됩니다. 대표적으로, 일시적으로 사용하는 로컬 변수는 스택 메모리를 사용하며, new 연산자를 통해 동적으로 할당되는 메모리는 힙 메모리를 사용합니다. 스택 메모리는 일반적으로 1MB 정도로 제한되어 있어 대용량 데이터(예: 이미지)를 저장하기에는 적합하지 않으므로, 이러한 데이터는 힙 메모리에 저장해야 합니다. 이를 통해 스택 오버플로우 에러를 방지할 수 있습니다.OpenCV에는 Mat이라는 클래스가 있습니다. 이 클래스는 이미지의 정보(예: 너비, 높이, 타입 등)와 이미지 데이터가 저장된 힙 메모리의 주소를 저장하는 변수들을 포함하고 있습니다. Mat 변수를 단순히 선언할 경우, 이미..

opencv 2023.11.25

(opencv) Rectangle 간의 조작에 관해

cv:: findContours() 나 cv::connectedComponentsWithStats() 에 의한 오브젝트를 찾아서 rectangle로 표현하기도 한다.결함을 검출하는 시스템이라면 결함부분을 rectangle로 표시를 하는데 가까운 결함들은 통합하기도 하기때문에 도움이 되리라고 생각한다. 아래와 같이 두개의 cv::Rect 가 있을 경우,  A B 가 교차하고 있는지 확인cv::Rect rectA = cv::Rect(50, 50, 100, 50); cv::Rect rectB = cv::Rect(200, 80, 70, 50); if ((rectA & rectB).area() > 0)    // 붙어 있음 else    // 떨어져 있음2. A B 를 통합cv::Rect rectAB = rect..

opencv 2023.11.23

(opencv) Mat 의 기초

cv::Mat (cv 는 namespace를 의미하고 특별을 using namespace cv; 를 명시하지 않는 이상 지정을 해야 함) 2D (W x H) 이미지 정보를 보관하는 클래스 이미지 데이터는 힙메모리에 존재하고 cv::Mat 는 메모리 주소를 보관하게 된다. 이미지 메모리는 명시적으로 release() 멤버 함수를 이용하여 명시적으로 삭제 할 수 있으나 암시적으로 참조 카운트가 0 가 되었을 때 자동 삭제된다. 메모리 삭제 코드의 누락으로 이미지 메모리가 좀비로 될 가능성이 없다. 기본적으로 메모리상 이미지 색상의 저장 순서는 B G R 순이다. (관습상 BMP 포멧 배열이기 때문) type() 1 픽셀의 내부 구성요소를 의미한다. 여러 타입이 있지만 이미지 처리에선 아래 2가지만 생각하자...

opencv 2023.08.05