반응형

개요

ubuntu 20.04 LTS 에서 OpenCV C++ 기본 빌드 환경에 대해서 샘플로 작성한 포스트. 해당 샘플은 카메라로 받은 이미지를 OpenCV imshow() 를 통해서 보여준다.

기본 틀이기 때문에 처음에는 복붙으로 확인이후 자신이 개발하고자 하는 것에 맞춰서 수정해 나가면 된다. 물론 makefile 기반이다.

굳이 camera 코드를 샘플로 작성한 이유는 임베디드 환경에서 카메라 다루게 되는 경우 성능상 C++을 써야 하기 때문이다. 특별한 이유가 없다면 가능하면 그냥 opencv-python 을 사용하자(하지만 제품을 만들려면 저사양 고성능을 뽑아야 하느라 삽질하겠지).

makefile sample

makefile 에 대해서 배운적이 없다면 복붙전에 읽어보고 사용하는 것이 좋다. 파일명은 반드시 makefile로 지어야 한다.  make clean 을 할 경우 규칙에 의해서 빌드 결과와 실행 파일이 삭제 되도록 되어 있다.

# Makefile
CPPFLAGS = -std=c++14 $(shell pkg-config --cflags opencv4)
LDLIBS = $(shell pkg-config --libs opencv4)
# source file name
OBJS = webcam_sample.o
# result execute file name
TARGET = test

all: $(TARGET)

$(TARGET): $(OBJS)
	g++ $(CPPFLAGS) -o $@ $< $(LDLIBS)

clean:
	rm -f *.o
	rm -f $(TARGET)

camera sample code

널리 알려져 있는 camera sample code에서 실행시 카메라 번호를 수정할 수 있도록 약간만 수정한 소스코드이다. 

// webcam_sample.cc
#include <opencv4/opencv2/videoio.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <iostream>
#include <string>

bool is_number(const std::string& s)
{
// 
    return !s.empty() && std::find_if(s.begin(), 
        s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end();
}

int main(int argc, char** argv)
{
    int cam_num = 0;
    if (2 == argc) {
        auto camNumParam = std::string(argc[1]);
        if (is_number(camNumParam)) {
            cam_num = std::atoi(camNumParam);
        }
    }

    cv::VideoCapture cap(cam_num);
    if(!cap.isOpened()) {
        std::cout << "did not open camera" << std::endl;
        return -1;
    }
    cv::Mat frame;
    while(1)
    {
        cap >> frame;
        cv::imshow("Camera Capture", frame);
        if (cv::waitKey(30) >= 0)
        {
            break;
        }
    }
    return 0;
}

카메라 장치 다룰때 주의사항

우분투는 먼저 인식한 카메라 장치 순으로 번호를 부여한다. 일반적으로 웹에 돌아다니는 예제는 0번으로 되어 있지만, 노트북같은 환경에서 usb 카메라를 붙이면, 노트북 기본 카메라가 0번, usb web cam은 1번으로 잡히게 된다.

또한 다른 프로그램에서 카메라를 점유(사용)하고 있을 경우에는 다른 프로그램에서 접근을 할 수 없다.

반응형

'Computer Vision' 카테고리의 다른 글

Computer Vision 이미지 자료형  (0) 2024.01.18
Ubuntu 20.04 OpenCV 4.x + cuDNN 설치  (0) 2023.04.26
반응형

라즈베리 파이3 : 카메라 모듈 v2

알아야 했던 배경

참여한 프로젝트에서 다수의 라즈베리 파이기기에서 사진을 찍어서 가져와야 되므로 반드시 알아야 했던 기능이다.


하드웨어 설치

하드웨어는 방향을 잘 살피고 꼿으면 된다(참 쉽죠?). 


카메라 제어하기(소프트웨어)

공식 라즈베리 파이 카메라 모듈 v2를 사용한다면, 라즈비안에 기본적으로 카메라를 컨트롤 할 수 있는 프로그램을 이미 갖고 있다. 소프트웨어를 개발할 경우 파이썬에는 라이브러리를 제공하고 있다. bash 쉘에서 프로그램 실행이 가능하다면, 다른 JAVA, C/C++ 기타 가벼운 프로그래밍 언어로도 카메라를 컨트롤을 할 수 있다.


기존 프로그램 사용방법은 라즈베리 파이 공식 문서에 있다. 크게 raspistill, raspivid, raspistillyuv라는 프로그램이 존재하는데, 이중 raspistill, raspistillyuv는 이름처럼 거의 비슷한 사진 촬영(영문으로는 image capture로 되어 있지만 기능상 사진 촬영이적절하다)기능이고 raspivid는 비디오 촬영 기능이다.


카메라 설치 테스트

 공식문서에서 소개하는 방식으로 카메라가 정상적으로 설치되었는지 확인하기 위해서는 터미널 창에 다음 명령어를 실행한다.

raspistill -v -o test.jpg

 정상적으로 하드웨어가 설치되어 있다면, 약 5초간 실시간 동영상이 화면이 보이고 난다음에 카메라 모듈에 대한 정보를 출력된다. 여기서 '-'붙은  명령어는 옵션을 의미하므로 해당 문서를 참고를 해야 한다.

공식 프로그램 옵션 문서[참조링크]

(귀찮아서 그렇지 나중에는 어딘가에 따로 적어 놔야 할 것이다)

카메라 모듈 정보에서 주목해야 할 것은 기본적인 화질이 75~85로 출력되도록 설정이 되어 있다는 것을 알 수 있다. 이처럼 디폴트 설정값이 무엇인지 알아야 자신의 프로젝트에 적절히 사용할 수 있다.


필자 기준으로 가장 기본적으로 알아야 하는 옵션은 다음과 같다. 공식문서와 순서가 다르다.

 -rot

화면 회전각도 단위는 도(dgree)이다(각도가 나오면 단위가 매우 민감함)

 -t

옵션뒤에 입력된 수치만큼 마이크로초(ms)후의 카메라에서 캡쳐한다 0을 입력하면, 무한대가 된다. 기본적으로는 5000으로 되어 있어서 5초후에 사진이 찍힌다.

 -k

사진을 x키나 enter키의 입력을 감지해서 이미지를 찍는다. -t 옵션을 0으로 하고 연동하면 자연스러운 디지털 사진기처럼 구현할 수 있다.

 -o

경로를 포함한 파일저장 이름을 적되 확장자까지 적어야 한다. 

 -q

앞서 언급한 화질로 0~100까지 정할 수 있다. 

 -n

미리보기 화면을 끈다. 미리보기 설정은 기본적으로 되어 있다. 

 

 -w

이미지의 가로길이 단위는 픽셀이다 

 -h

이미지의 세로길이 단위는 픽셀이다. 

 -md

모드로 기본적으로 정해져 있는 화면비와 화면 길이로 잡아준다 0~7까지 있다(이름을 잘못 지은것 같다). 


다음은 이미지나 사진에 대해서 조금 알때 먼저 살펴보게 되는 옵션이다.

 -e

인코딩을 변경할 수 있다. 변경가능한 인코딩은 jpg, bmp, gif, png인데 기본적으로는 jpg로 되어 있다. 

 -ss

셔터 스피드를 설정할 수 있다 최대 6000마이크로 초로 할 수 있다. 


이 밖에 문서에서 제공하는 기능은 다양하다. 화면 밝기 조절에서 나이트 모드 등 다양한 기능들이 있지만, 일반적으로 많이 사용하지 않는 기능들이기 때문에 여기에는 정리 하지 않았다.


카메라 접근 설정

 말이 접근 설정이지만 실제로는 퍼미션(permission)설정이다. 리눅스 시스템에서는 기본적으로 폴더와 파일에서 접근 권한을 3단위로 나누어진다. 읽기/쓰기/실행 단계로 나누어지며, 이 접근관한을 각각 수퍼계정(root)/소유계정(user)/아무나(anyones) 기본적으로 프로그램을 네트워크 통신을 통해서 실행하게 되는 경우 아무나(?)에 해당된다. 때문에 라즈베리파이에 키보드와 마우스를 꼿고 실행하거나 ssh로 원격상태로 실행할 경우에는 대부분 소유계정에서 실행을 하기 때문에 문제없이 작동이 된다.


 하지만, 자신이 만든 웹 앱이나 프로그램으로 실행할 경우에는 계정이 아무나(혹은 게스트)가 되는데 이때 디바이스는 기본적으로 아무나 접근할 수 없게 설정되어 있다. 때문에 이러한 설정을 변경해줘야 한다. 카메라 모듈 v2의 디바이스 파일은 /dev/vchiq이다. 익숙한 리눅스 유저들은 다음 명령어를 실행할 것이다.

sudo chmod 766 /dev/vchiq

하지만, 이렇게 변경을 해도 디바이스 쪽은 다시 재부팅을 하면 초기상태로 되돌아가 버린다. 이를 위해서는 초기 퍼미션을 바꿔야 하는데 열심히 포럼글을 찾다가 알게 되었다. 물론 포럼에 올라와있는 글대로 하면 안되고 의미를 생각하고 설정을 하니 된것이다(우연한 실수로 성공함).

다음경로에 파일을 생성한다.

sudo nano /etc/udev/rules.d/10-vchiq-permissions.rules

다음 한줄을 입력한 다음에 저장한다.

SYSTEM=="vchiq",GROUP="video",MODE="766"


그리고 재부팅을 한뒤에 다음 명령어로 지속적으로 적용이 되는지 확인하면된다.

ls -al /dev/vchiq


반응형

+ Recent posts