본문 바로가기

창업성장기술개발(디딤돌) 연구 기록

[디딤돌] 연구 기록 9~11주차 - ArUco Marker2

반응형

 

 

☞ 운영 체제 : Linux Ubuntu 20.04.5 LTS - focal
☞ CPU : AMD Ryzen 7 5800H with Radeon Graphics (16 CPUs), ~3.2GHz
☞ 그래픽카드 : NVIDIA GeForce RTX3070 Laptop GPU

 

 

 

 

 


 

 

♣ 유의 사항 ♣

 

 

중간중간에 에러 발생 시 해결 방법을 적어두었는데 해당 방법과 똑같이 진행했는데도 에러가 나면 일단 끝까지 진행해보자. 그래도 에러가 발생하면 댓글로 남겨주기 바란다.

 

 

 

 


 

 

 

 

 

TTA 소프트웨어 시험 인증을 준비하면서 운영체제를 정하는 것이 필요했다. Window 10, Ubuntu 18.04, Ubuntu 20.04 등 다양한 운영체제에서 개발 환경을 구축하면서 수많은 에러에 직면하기도 했다. 더 이상 운영체제 개발 환경 구축에 시간을 뺏기지 않기 위해, 그리고 지금은 코딩을 하고 싶기 때문에 Ubuntu 20.04로 정하여 개발을 진행하기로 했다. Jetson에서 개발하는 것은 이래저래 시간이 너무 오래 걸린다. CPU, RAM과 같이 기존에 사용하던 노트북에 비해 스펙이 한참 남아 설치, 빌드 시간에 꽤 많은 시간을 소비했다.

 

노트북에 SSD 2개가 있어 하나는 윈도우로 사용하고 나머지를 Ubuntu로 사용하고 있다. 혹시나 이 글을 읽으며 개발을 진행한 사람이 있다면 미안하지만 Jetson 환경의 경우 지원하지 않는 소프트웨어도 많았고 Ubuntu 18.04에서는 YOLOv5 개발을 진행하기 어려웠다는 점 먼저 밝히고 시작한다.

 

 

 

 

 

ArUco Marker 실습

 

지난주에는 ROS 오픈소스를 통해 ArUco 마커를 감지했었다. cmake를 통해 OPENCV 빌드를 완료하고도 cv2.aruco가 감지되지 않는 경우가 있다. 그런 경우에는 다음과 같이 터미널에서 pip를 이용하여 opencv-contrib-python 패키지를 설치하자.

 

 

 

 

python3 -m pip install opencv-contrib-python

 

 

설치를 마치고 python3에서 cv2.aruco 모듈을 불러오면 에러가 사라지는 것을 볼 수 있다.

 

 

 

 

 

ArUco Marker 생성

 

먼저, 마커를 인식하기 위해 마커를 다운로드한다. 아래의 사이트에서 사이즈별 ArUco 마커를 얻을 수 있다. 다만, svg 확장자로 얻을 수 있으니 이를 png 파일로 변환하기 위해서는 다른 사이트에 파일을 업로드하는 과정을 거쳐야 한다.

 

 

 

 

☞ ArUco Marker 생성

 

Online ArUco markers generator

Dictionary: Original ArUco 4x4 (50, 100, 250, 1000) 5x5 (50, 100, 250, 1000) 6x6 (50, 100, 250, 1000) 7x7 (50, 100, 250, 1000) Marker ID: Marker size, mm:

chev.me

 

 

 

☞ SVG to PNG 확장자 변환

 

온라인에서 SVG 파일을 PNG로 변환하세요.

이 SVG에서 PNG로 전환시킬 수 있는 변환기로 SVG 파일을 PNG 문서로 빠르고 쉽게 변환시키세요.

svgtopng.com

 

 

 

 

 

※ ArUco ID 찾기

 

먼저, ArUco 마커를 감지하는 부분을 아주 간략하게 코드로 작성해보면 다음과 같다. 

 

 

#!/usr/bin/python3
import cv2
import cv2.aruco as aruco

# Video 
Video_filename = 'video/aruco_test_mp4_1920x1080.avi'
cap = cv2.VideoCapture(Video_filename)
VideoCap = True

def find_aruco_id(img, marker_size=4, total_markers=50, draw=True):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    key = getattr(aruco, f'DICT_{marker_size}X{marker_size}_{total_markers}')
    arucoDict = aruco.Dictionary_get(key)
    arucoParam = aruco.DetectorParameters_create()
    bbox, ids, _ = aruco.detectMarkers(gray, arucoDict, parameters=arucoParam)
    
    if draw:
        aruco.drawDetectedMarkers(img, bbox)

    return ids

while True:
    if VideoCap:
        VideoCap, frame = cap.read()
    else:
        frame = cv2.imread("sample.png")        

    fps = cap.get(cv2.CAP_PROP_FPS)
    delay = round(100 / fps)
    #print("FRAME FPS ; ", int(cap.get(cv2.CAP_PROP_FPS)))

    id = find_aruco_id(frame)
    print(id)

    if cv2.waitKey(delay) == 27:
        break
    cv2.imshow("WINDOW", frame)

cap.release()
cv2.destroyAllWindows()

 

 

상단에 작성한 find_aruco_id 함수 호출을 통해 ArUco 마커의 id를 출력할 수 있다. 두 번째, 세 번째 인자 marker_size, total_markers의 초기값을 변경하면 감지할 마커를 달리할 수 있다.

 

 

  • marker_size는 4x4, 5x5, 6x6, 7x7가 있는데 이는 본인이 사용한 크기의 ArUco 정보를 입력해주면 된다.
  • total_markers에는 50, 100, 250, 1000을 입력할 수 있다.

 

 

def find_aruco_id(img, marker_size=4, total_markers=50, draw=True):

	if draw:
		aruco.drawDetectedMarkers(img, bbox)

 

 

find_aruco_id 함수의 세 번째 파라미터 draw를 통해 인식된 aruco 마커 모서리를 인식할 수 있다. 모서리 인식이 필요 없는 경우 draw=False로 바꿔주면 된다.

 

 

return bbox, ids

bounding_box, aruco_id = find_aruco_id(frame)

 

 

함수 리턴 값으로 ids를 입력하면 id 값을, bbox를 입력하면 마커의 bounding box 값을 출력할 수 있다.

 

두 가지의 값을 모두 얻고 싶다면 리턴 값에 두 변수를 모두 추가하면 된다. 함수를 호출할 때만 bbox, ids의 값을 저장할 변수를 함께 선언하면 된다. bbox는 tuple 클래스, ids는 NoneType으로 출력이 된다. ids는 find_aruco_id를 호출했을 경우 numpy.ndarray 클래스로 변형된다.

 

 

fps = cap.get(cv2.CAP_PROP_FPS)
#print("FRAME FPS ; ", int(cap.get(cv2.CAP_PROP_FPS)))

 

 

CAP_PROP는 OPENCV의 Video I/O의 플래그 형식 중 VideoCaptureProperties의 enum으로 정의되어있다. OPENCV DOCS에서 어떻게 정의되었는지 확인할 수 있다.

 

 

출처 : https://docs.opencv.org/3.4/d4/d15/group__videoio__flags__base.html

 

 

CAP_PROP_FPS는 5번째 플래그이다. 사용 중인 영상의 fps는 cap.get(cv2.CAP_PROP_FPS)를 통해 입력받을 수 있다. FPS외에도 다른 정보들도 위의 내용을 통해 입력 받을 수 있으니 참고 바란다.

 

round는 반올림을 해주는 python의 내장 함수이다. 소수점 몇 번째 자리에서 반올림하는지 지정해주려면 두 번째 인자에 해당 수를 추가하면 된다. 지정해주지 않으면 자동으로 일의 자리 수까지만 반환한다. 이런 경우에는 소수점이 의미가 없어 따로 지정해주지 않았다.

 

 

delay = round(100 / fps)

if cv2.waitKey(delay) == 27:
    break
cv2.imshow("WINDOW", frame)

 

 

위에서 100 / FPS를 반올림 한 값을 delay 변수에 저장했다. 

 

 

 

 

 


Hiseeu POE CCTV 설치 후기

 

hiseeu 홈페이지

https://www.hiseeu.com/

 

 

hiseeu CCTV 구매 - 알리 익스프레스

https://ko.aliexpress.com/item/1005004118986633.html?spm=a2g0o.cart.0.0.2c0c56baSLRDmm&mp=1&gatewayAdapt=Pc2Msite

 

 

 

 

※ PoE CCTV

 

PoE(Power over Ethernet)은 이더넷 케이블(랜선) 하나로 파워와 데이터를 함께 전송할 수 있는 시스템을 의미한다.

 

 

 

 

 

 

 

※ NVR Recorder

 

 

 

8채널 4K 5MP PoE 모델이다. CCTV 8개까지 동시에 모니터링이 가능하다. 네트워크 설정을 따로 해야 한다.

 

 

 

 

 

 

※ VMS

 

VMS(Video Management System)는 영상 관리 시스템으로 다채널 CCTV 모니터링이 필요한 곳에서 사용하기 위해 개발되었다. CCTV 관제 시스템으로는 VMS 외에도 CMS(Central Monitoring System) 중앙 관리 시스템이 있는데 아래의 블로그를 참고하면 두 시스템의 차이를 알 수 있다.

 

 

☞ 꼬바리님의 티스토리 블로그

 

CMS 와 VMS ? ( CCTV S/W )

CCTV 관제 시스템 중 CMS 와 VMS 란? CMS 란 Central Monitoring System 의 약자로, 중앙 관리 시스템이라 하며 VMS 란 Video Management System 의 약자로, 영상 관리 시스템이라 한다. 국내에서는 2005년부터 CMS를 사

byul91oh.tistory.com

 

 

 

 

 

 

NVR Recorder와 모니터를 HDMI로 연결하면 다채널의 CCTV 영상 모니터링을 할 수 있다. 집에서는 IPTIME 공유기를 사용하고 있는데 관리자 설정을 위해서는 192.168.0.1을 웹에 입력함으로써 접근할 수 있다. 먼저 위 화면서 DHCP Enable 상태로 Net Test를 하면 내부 IP 주소를 얻을 수 있다. 위 경우에는 192.168.0.76을 얻었다. 

 

 

 

 

IPTIME 관리자 설정에 가서 고급 설정 - NAT/라우터 관리 - 포트 포워드 설정 탭에 가면 규칙을 생성할 수 있다. NVR, NVR_MEDIA 규칙 명을 입력해주고 IP에는 아까 Net Test 후 얻었던 내부 IP 주소를 입력해주면 된다. 포트 번호는 기기에 맞게 입력해주면 되는데 이 기기의 경우 34567이었다.

 

이렇게 포트 포워딩을 마치면 웹에서 192.168.0.76을 입력해서 확인할 수 있다. 근데 이는 같은 공유기를 사용하는 경우에만 접근이 가능하므로 아무 의미가 없다.

 

 

 

 

다시 IPTIME에서 기본 설정 - 시스템 요약 정보 탭에 가면 오른쪽 인터넷 정보에서 외부 IP 주소를 확인할 수 있다. 외부 IP 주소를 통해 멀리 있을 때도 웹 뷰어에 접속하여 내 CCTV를 확인할 수 있게 된다.

 

 

 

 

 

※ Smart Phone Application

 

아이폰의 경우 XMEye Pro 어플리케이션을 통해 CCTV 현황을 확인할 수 있다.

 

 

 

 

CCTV라 그런지 왜곡 보정이 된 영상으로 얻을 수 있는 건 아니었다. 다운로드는 녹화가 된 상태에서 서버를 통해 다운로드할 수 있다. 가끔 사람이 있으면 인식하여 바운딩 박스가 그려졌는데 쓸 수 있을 정도의 인식률은 아니었다. 녹화된 영상에도 그려져 나올 것 같아서 기능을 꺼야 하는데 아직 어디 있는지는 잘 모르겠다. 

 

 

 

 


③ 실행 결과

 

 

 

resize 함수로 창의 크기를 줄이는 것은 인식률에 도움이 되지는 않는 것 같지만, 실행 시간에는 압도적인 차이가 있으니 크기를 줄여서 실행하는 것이 좋다.

 

자취방 마당 앞에서 촬영을 했다. 사람들이 지나가면서 다 쳐다보니 주목을 받아 기분이 좋지 않을 수가 없었다. 사진 오른쪽 하단을 보면 터미널에 [[1], [2]] 출력을 볼 수 있다. CCTV 카메라 기준으로 상단 끝 부분까지는 약 6~7m 가까이 되고 약 10m까지는 인식이 된다. (물론 멀어질수록 인식률이 떨어지긴 하다.)

 

풋살 경기장 규격은 가로 20m, 세로 40m이다. 풋살 경기장 모서리 4곳, 하프라인 좌우 2곳, Birds Eye View를 위한 양 골대 위 2곳으로 총 8곳에 CCTV를 설치한다고 가정하였을 때  각 카메라가 10m 이내를 스캔할 수 있다면 경기장의 대부분을 영상 데이터로 입력받을 수 있다.(각도에 따라 다르겠지만) 

 

빨간 조끼는 어둡고, 초록 조끼는 밝은 편이다. 어두운 조끼보다는 밝은 조끼가 ArUco 마커를 잘 인식하는 것으로 추측한다. 어플리케이션으로는 아직 녹화 영상을 다운로드해보지 못했고, 웹 뷰어를 통해 영상을 다운로드했는데 영상의 비디오 코덱으로 avi와 h265x가 있었다. 다만, h265x 코덱으로 다운로드하는 경우 영상이 불완전하다. 그래서 어쩔 수 없이 avi 코덱으로 다운로드했다.

 

 

 

 

※ OpenShot 비디오 에디터

 

영상을 다운로드해서 내가 사용할 부분만 비디오 편집 프로그램을 이용하여 잘라냈다. 비디오 편집 프로그램으로는 오픈샷 비디오 에디터를 사용했다. 세부적으로 영상을 편집하는 것이 아니라 영상 길이를 자를 수만 있으면 됐기에 간단하고 가벼운 소프트웨어가 필요했다.

 

 

 

OpenShot 비디오 편집기 | 리눅스, 맥 및 윈도 용 자유, 개방형 및 수상 경력 있는 비디오 편집기!

Eric Park - https://launchpad.net/~ericswpark Jonathan Thomas - https://launchpad.net/~jonoomph Sebul - https://launchpad.net/~sebul

www.openshot.org

 

 

다운로드는 위 사이트나 OS 내의 우분투 소프트웨어 앱에서 받을 수 있다. 나는 우분투 소프트웨어 앱에서 다운로드했다.

 

 

 

 

오픈샷의 장점은 무겁지 않고 리눅스 환경에서도 사용할 수 있다는 점이다. 개발을 위해 리눅스 환경에서 작업하고 있을 때 영상 편집만을 위해 윈도우 환경으로 재부팅할 필요가 없다는 것이다.

 

영상 길이를 잘라내 시간을 줄이고 저장할 때 비디오 코덱과 해상도, fps를 선택할 수 있다.

 

 

 

 

  1. 원본 영상 - 1024 x 576, 25 fps
  2. 두 번째 영상 - 1024 x 576, 30 fps / 약 250MB
  3. 세 번째 영상 - 1920 x 1080, 25 fps / 약 650MB

 

편집해서 비디오 코덱, 해상도, fps를 원본과는 조금 달리해 실험했다. 당연한 얘기지만 해상도가 높고 fps가 높을수록 ArUco 마커의 인식률이 좋았다. avi 컨테이너를 유지하고 비디오 코덱은 mpeg4로 했다.

 

해상도가 높은 세 번째 영상의 인식률이 가장 좋았는데 영상의 용량이 너무 크게 늘긴 했다. 총 8개의 CCTV 채널로부터 영상을 다운로드할 것이기 때문에 충분한 양의 저장소가 필요해 보인다. 그리고 동시 다운로드 속도도 궁금하다.

 

나중에 CCTV 녹화 영상을 서버로 통해 자동으로 다운로드하는 시스템을 개발하게 된다면 영상도 지속적으로 avi 컨테이너로 다운로드하게 될 것이다. 중간에 필요한 경기 영상만 잘라서 사용하고 싶은데 선수를 개인별로 구별하기 위해서는 ArUco 마커의 인식률이 기술을 적용할 수 있는 수준이어야 한다. h265 코덱으로 다운로드하면 해결될 것 같은데 OPENCV 함수 중에서 영상을 실행할 방법은 아직 없는 것 같다.

 

 

 

 

 

반응형