opencv 19

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

C# 와 C++/CLI Dll 사이의 이미지 전달

Windows 에서 GUI 개발은 MFC 보다 UI도 풍부하고 다루기 쉬운 C# 으로 개발하는게 편리하다.이러한 .NET 환경에서 OpenCV(C++) 을 사용하기 위해서는 Wrapper 인 OpenCVSharp 을 이용하는 방법도 있으나 interface를 새로 알아야 한다는 단점이 있다. 하지만 직접 OpenCV를 C++ 그대로 사용하고자 할때는 C++/CLI(Managed Code와 Native C++ 혼용) 환경을 이용하자.프로젝트 생성 방법 GUI(C#) 에서 읽어들인 BMP 메모리를 C++/CLI 에 전달하여 OpenCV로 처리한 후 결과 이미지를 다시 GUI에 전달하는 방법은 아래와 같이 .NET Managed memory 와 Native Heap memory에의 변환 처리가 필요하다. 1...

opencv 2025.02.10

(opencv) 이미지위의 직선상의 픽셀위치 구하기

아래 이미지의 빨간 라인의 픽셀의 값들을 알아 보고자 하자. 출발 포인트를 (200, 100), 도착 포인트를 (250, 180) 이라 할 때 방법 1) 마스크 이미지를 이용cv::Mat image = cv::imread("image");cv::Point A(200,100); cv::Point B(250,180); // 바탕이 검정이 마스크 이미지를 생성// 또는  cv::Mat mask(image.size(), uchar(0), CV_8UC1); cv::Mat1b mask(image.size(), uchar(0));// 출발점과 끝점을 잇는 하얀선을 그림cv::line(mask, A, B, cv::Scalar(255)); std::vector points1; cv::findNonZero(mask, po..

opencv 2025.02.08

(opencv) pixel access time

샘플 Mat : 5000 x 3000 BGR Color All Blackcv::Mat image = cv::Mat::zeros(cv::Size(5000, 3000),CV_8UC3); RGB 의 합을 계산 방법 1) at(y좌표, x좌표)int sum = 0; for (int i = 0; i    for (int j = 0; j          // gray 이미지의 경우          // uchar pixel = image.at(i, j);          cv::Vec3b pixel = image.at(i, j);          sum += pixel[2] + pixel[1] + pixel[0];    } } 방법 2) 선두 메모리 포인터 사용int sum = 0; for (int i = 0; i..

opencv 2025.02.08

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