[파이썬, Python] OpenCV - 레이블링(labeling)과 외곽선 검출
1. 레이블링(labeling) 이진화, 모폴로지를 수행하면 객체와 배경 영역을 구분할 수 있게됨 객체 단위 분석을 통해 각 객체를 분할하여 특징을 분석하고 객체의 위치, 크기 정보, 모양 분석, ROI 추출 등이 가능함 서로 연결되어 있는 객체 픽셀에 고유번호를 할당하여 영역 기반 모양 분석, 레이블맵, 바운딩 박스, 픽셀 개수, 무게중심, 좌표 등을 반환할 수 있게 함 cv2.connectedComponents(영상, 레이블 맵) 레이블 맵: 픽셀 연결 관계(4방향 연결, 8방향 연결..) return: 객체 개수, 레이블 맵 행렬 cv2.connectedComponentsWithStats(영상, 레이블맵) return: 객체 개수, 레이블 맵 행렬, (객체 위치, 가로세로길이, 면적 등 행렬, 무게..
2023. 9. 2.
[파이썬, Python] OpenCV - 모폴로지 처리, 모폴로지 연산
1. 모폴로지 처리영상의 밝은 영역이나 어두운 영역을 축소, 확대하는 기법모폴로지 구조 요소를 생성cv2.getStructuringElmement(구조 요소의 모양, 사이즈) 구조 요소의 모양cv2.MORPH_RECT: 사각형cv2.MORPH_ELLIPSE: 타원형cv2.MORPH_CROSS: 십자형 1-1. 침식(erosion) 연산이미지를 깎아내는 연산객체 크기는 감소하고 배경은 확대작은 크기의 객체(노이즈)제거 효과가 있음 cv2.erode(영상, 구조요소, 출력영상, 고정점 위치) 1-2. 팽창(dilation) 연산물체의 주변을 확대하는 연산객체가 커지는 연산팽창 연산은 객체 외곽을 확대시키는 연산객체 크기는 증가되고 배경은 감소되는 효과cv2.dilate(영상, 구조요소, 출력영상, 고정점 ..
2023. 9. 2.
[파이썬, Python] OpenCV - 동영상 필터 입히기
💡 문제. 웹캠(또는 동영상)에서 스페이스바를 누를 때마다 '일반영상', '가우시안 필터영상', '케니 필터영상'으로 변환되는 프로그램을 작성해보자. 📄 사용한 동영상 파일 import cv2 import numpy as np cap = cv2.VideoCapture('cat.mp4') def blur_filter(img): img = cv2.GaussianBlur(img, (3, 3), 0) return img def canny_filter(img): med_val = np.median(img) lower = int(max(0, 0.7 * med_val)) upper = int(min(255, 1.3 * med_val)) img = cv2.GaussianBlur(img, (3, 3), 0) img = ..
2023. 9. 2.
[파이썬, Python] OpenCV - 영상의 필터링, 블러링, 엣지(Edge)검출
1. 필터링(filtering) 커널(filter)이라고 하는 행렬을 정의하고, 이 커널을 이밎 위에서 이동시켜 가면서 커널과 겹쳐진 이미지 영역과 연산을 한 후, 그 결과값을 연산을 진행한 이미지 픽셀을 대신하여 새로운 이미지를 만드는 연산 cv2.filter2D(영상, 이미지 깊이, 커널, 중심점 좌표, 추가될 값, 가장자리 화소 처리) 이미지 깊이: -1(입력과 동일) 커널행렬: 3*3, 5*5, ... 가로 세로가 동일한 행렬 사용 중심점 좌표: 기본값은 왼쪽 상단 추가될 값: 행렬연산 후 더해지는 값 가장자리 화소 처리 BORDER_CONSTANT: 000abcdefg000, 가장 자리를 0으로 채움(검정색) BORDER_REPLICATE: aaaabcedfgggg, 가장 자리를 가장 끝 픽셀로..
2023. 9. 1.
[파이썬, Python] OpenCV - 원하는 ROI 설정 후 투시변환하기
💡 문제. namecard.jpg에 retangle과 circle을 그리고 마우스이벤트를 줘서 칸에 맞추면 투시변환을 해보자. import cv2 import numpy as np import sys def drawROI(img, corners): cpy = img.copy() c1 = (192, 192, 255) c2 = (128, 128, 255) for pt in corners: cv2.circle(cpy, tuple(pt.astype(int)), 25, c1, -1, cv2.LINE_AA) cv2.line(cpy, tuple(corners[0].astype(int)), tuple(corners[1].astype(int)), c2, 2, cv2.LINE_AA) cv2.line(cpy, tuple(c..
2023. 8. 30.