개요
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 |