2018-03-13 : * Raspberry Pi 3 B + 지원 * 무선 규정 도메인이 설정 될 때까지 WiFi가 비활성화됩니다 (Pi3B + 전용). - 도메인은 'Raspberry Pi Configuration'(rc_gui)을 통해 수행 할 수 있습니다. 'raspi-config'로 설정하거나 'country ='를 적절한 ISO 3166으로 설정하십시오 /etc/wpa_supplicant/wpa_supplicant.conf의 alpha2 국가 코드. * 기본 무선 규제 도메인이 설정되지 않았습니다. * 다른 화면 크기 및 해상도에 대한 바탕 화면 지원 추가, 모양 설정 및 픽셀 이중화의 여러 사전 설정 옵션 포함 Raspberry Pi Configuration의 옵션 * Thonny 버전 2.1.16 포함 * Adobe PepperFlash 플레이어 버전 29.0.0.113 포함 * Pygame Zero 버전 1.2.post1 포함 * Bluetooth 플러그인은 이제 Bluetooth LE HID 장치에 대한 연결을 지원합니다. * 네트워크 플러그인은 이제 5G 호환 AP를 나타냅니다. * Bluez ALSA 서비스의 최신 변경 사항이 병합되었습니다. - CLI 부팅과 GUI 부팅에서 서비스 시작 * dhcpcd 네트워킹 플러그인의 최신 변경 사항이 병합되었습니다. * 파이 탑 (pi-top) 디바이스에서의 실행에 대한 향상된 지원 PiX 테마 및 아이콘에 대한 작은 디자인 변경 * 버그 수정 - 가짜 창 크기 조정 핸들 숨기기 * 버그 수정 - 스크래치 2 원격 GPIO 상태 블록이 올바르게 작동합니다. * 업데이트 된 WiFi 펌웨어 - brcmfmac43455-sdio 7.45.154 - brcmfmac43430-sdio 7.45.98.38 * 새로운 패키지 : - 정책 키트 -1 - obconf - python-buttonshim python3-buttonshim - python-unicornhathd python3-unicornhathd - python-pantilthat python3-pantilthat * Linux 커널 4.9.80 이상 * Raspberry Pi 펌웨어 3347884c7df574bbabeff6dca63caf686e629699
라즈베리파이 PIXEL 데스크탑에서 사용할 수 있는 화면 캡쳐 프로그램 scrot 사용법을 정리합니다.
scrot는 SCReenshOT의 약자이며, 말 그래도 화면 캡처를 하는 프로그램입니다. 기본적으로 텍스트 기반의 프로그램이며 일단 터미널 창에서 scrot -h 라고 입력하면 도움말을 보여주는데, 중요한 명령어가 위로 빨리 올라가버리니까 scrot -h | more 라고 입력하여 명령어를 확인합니다.
개인적으로 자주 쓰는 옵션은 -d, -u, -b 입니다.
-d는 delay를 의미하고, 보통 -d 5 처럼 바로 뒤에 숫자를 쓰면 해당하는 시간(초단위) 이후에 캡쳐를 합니다. 예를 들어, 웹브라우저가 떠있는 전체 화면을 캡쳐하려면 터미널 창을 하나 띄우고 여기에 scrot -d 5 라고 입력하고 터미널 창을 최소화하여 기다립니다.
-u 옵션은 현재 활성화된 왼도우만을 캡쳐하고 싶을 때 사용합니다. 예를 들어, 터미널 창을 2개 띄워놓고 ls 화면을 캡쳐하려면 다른 창에서 scrot -d 5 -u 라고 입력하고, 5초 안에 ls 명령을 내린 터미널 창을 클릭하여 활성화 시킵니다.
그런데 -u 옵션만 사용하면 윈도우 타이틀바와 테두리를 함께 캡쳐하지를 않네요. 뭔가 약간 어색해서, 보통은 -b 옵션을 같이 줘서 border까지 함께 캡쳐를 합니다. scrot -d 5 -u -b 라고 입력해도 되고, scrot -d 5 -ub 라고 입력해도 됩니다.
이렇게 캡쳐한 화면은 바로 위 터미널 ls 화면에 보라색 글씨로 나타난 것처럼 <날짜>-<시간>-<해상도>_scrot.png 형태의 이름으로 저장됩니다. 화면 캡쳐니까 png 파일 포맷이 적당해보입니다.
단축키도 지원을 하는데요, PrtSc 키를 누르면 전체 화면을 저장합니다. 음.. PrtSc 키에 대해서 scrot 화면 캡쳐를 하는 것은 ~/.config/openbox/lxde-pi-rc.xml 파일에서 키바인딩이 기본으로 되어 있기 때문인데요..
만약 ALT + PrtSc 키에 대해 현재 활성화된 화면 캡쳐를 수행하도록 하고, CTRL + PrtSc 키에 대해 윈도우 선택 또는 사각형 영역 지정 캡쳐를 수행하려면 아래와 같이 lxde-pi-rc.xml 파일을 편집하면 됩니다. (287~296라인) 그리고 재부팅 또는 openbox --reconfigure 명령을 입력하면 됩니다.
작년 4월인가에 라즈베리파이3B 모델을 사고, 라즈베리파이 전용 카메라 모듈도 구입을 했습니다. 이때만해도 8M 카메라 모듈이 나오기 전이라 5M 모듈만 있을 때였죠. 이거 사자마자 거의 같은 가격으로 8M 모듈이 발표되서 슬펐던 기억이 있는데.. 암튼 그때만해도 라즈베리파이에 카메라를 붙이고 OpenCV를 깔아서 뭐라도 해볼 요량이었지만, 어쩌다 보니 카메라를 사놓고 별것 해보지도 못하고 구석에 쳐박아 두었었네요.
이번에 다시 라즈비안 OS를 새로 깔고 새마음으로 라즈베리파이에 카메라를 붙였습니다. OpenCV는 이미 깔아놨고, 이번에는 라즈베리파이 카메라를 사용해보려고 합니다. 라즈베리파이카메라를 사용하기 위해 raspicam라는 이름의 라이브러리를 사용할 것입니다. raspicam 라이브러리에 대한 설명은 아래 링크를 참고합니다.
위 사이트에 쓰여있듯이 raspicam은 BSD 라이센스를 따르기 때문에 자유롭게 이용이 가능하고, 일반 C++ 인터페이스뿐만 아니라 OpenCV 인터페이스도 지원합니다. raspicam 라이브러리도 소스 코드를 다운받아서 직접 빌드를 진행해야 라이브러리 파일이 생성됩니다. 설치와 관련되어서는 아래 블로그 설명이 잘 되어 있네요.
위와 같은 cmake 설정을 하고나면 화면에 출력되는 메시지가 cmake_messages.txt 파일에도 함께 저장됩니다. 이때 CREATE OPENCV MODULE=1 이라는 메시지가 출력이 되어야 raspicam 라이브러리가 OpenCV를 인식하고, OpenCV에서 함께 사용할 수 있도록 라이브러리를 생성합니다. cmake_messages.txt 파일의 전체 내용을 아래 [더보기]에 나타내었습니다.
-- The C compiler identification is GNU 4.9.2 -- The CXX compiler identification is GNU 4.9.2 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Found OpenCV: /usr/local (found version "3.2.0") -- ------------------------------------------------------------------------------- -- GNU COMPILER -- ------------------------------------------------------------------------------- -- Adding cv library -- -- ------------------------------------------------------------------------------- -- General configuration for raspicam 0.1.6 -- ------------------------------------------------------------------------------- -- Built as dynamic libs?:ON Compiler:/usr/bin/c++ -- C++ flags (Release): -std=c++0x -Wl,--no-as-needed -Wall -ffunction-sections -fomit-frame-pointer -O2 -ffast-math -DNDEBUG -lpthread -- C++ flags (Debug): -std=c++0x -Wl,--no-as-needed -Wall -ffunction-sections -g3 -O0 -DDEBUG -D_DEBUG -W -Wextra -Wno-return-type -lpthread -- CMAKE_CXX_FLAGS: -std=c++0x -Wl,--no-as-needed -Wall -ffunction-sections -- CMAKE_BINARY_DIR: /home/pi/raspicam-0.1.6/build -- -- CMAKE_SYSTEM_PROCESSOR = armv7l -- BUILD_SHARED_LIBS = ON -- BUILD_UTILS = ON -- CMAKE_INSTALL_PREFIX = /usr/local -- CMAKE_BUILD_TYPE = Release -- CMAKE_MODULE_PATH = /usr/local/lib/cmake/;/usr/lib/cmake -- -- CREATE OPENCV MODULE=1 -- CMAKE_INSTALL_PREFIX=/usr/local -- REQUIRED_LIBRARIES=/opt/vc/lib/libmmal_core.so;/opt/vc/lib/libmmal_util.so;/opt/vc/lib/libmmal.so -- -- -- Change a value with: cmake -D<Variable>=<Value> -- -- Configuring done -- Generating done -- Build files have been written to: /home/pi/raspicam-0.1.6/build
cmake가 정상적으로 동작하였으면 이제 실제 빌드 작업을 수행합니다. 기본적으로 make -j2 명령을 입력하면 되고, 혹시나 하는 마음에 빌드 메시지도 함께 기록합니다. 빌드가 완료되면 sudo make install 명령으로 실제 라이브러리를 시스템 폴더에 복사합니다.
pi@GoPiGo:~/raspicam-0.1.6/build $make -j2 2>&1 | tee build_messages.txt pi@GoPiGo:~/raspicam-0.1.6/build $sudo make install pi@GoPiGo:~/raspicam-0.1.6/build $sudo ldconfig
위 사진은 sudo make install 명령을 입력했을 때의 모습입니다. 일단 raspicam 라이브러리 설치가 완료되었습니다. 참 쉽죠? :-)
그러면 이제 raspicam 라이브러리와 OpecCV 라이브러리를 이용하여 카메라 입력을 받고 간단한 얼굴 검출 프로그램을 만들어보겠습니다. 홈디렉토리 아래에 coding/opencv/facedetect 디렉토리를 만들고, 여기에 main.cpp 파일을 생성합니다. main.cpp 파일은 아래와 같이 작성합니다.
#include <opencv2/opencv.hpp>
#include <iostream>
#include <raspicam/raspicam_cv.h>
using namespace cv;
using namespace std;
int main(int argc, char* argv[]) {
raspicam::RaspiCam_Cv cam;
cam.set(CV_CAP_PROP_FORMAT, CV_8UC3);
cam.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cam.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
if (!cam.open()) {
cerr << "Camera open failed!" << endl;
return -1;
}
CascadeClassifier cascade("haarcascade_frontalface_default.xml");
if (cascade.empty()) {
cerr << "Failed to open xml file!" << endl;
return -1;
}
Mat frame, gray, reduced;
int64 t1, t2;
bool do_flip = false;
while (1) {
cam.grab();
cam.retrieve(frame);
if (do_flip)
flip(frame, frame, -1);
t1 = getTickCount();
cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
resize(gray, reduced, Size(0, 0), 0.5, 0.5);
vector<Rect> faces;
cascade.detectMultiScale(reduced, faces, 1.1, 3, 0, Size(40, 40));
for (size_t i = 0; i < faces.size(); i++) {
Rect rc;
rc.x = faces[i].x << 1;
rc.y = faces[i].y << 1;
rc.width = faces[i].width << 1;
rc.height = faces[i].height << 1;
rectangle(frame, rc, Scalar(0, 0, 255), 3);
}
t2 = getTickCount();
cout << "It took " << (t2 - t1) * 1000 / getTickFrequency() << " ms." << endl;
imshow("frame", frame);
int k = waitKey(1);
if (k == 27)
break;
else if (k == 'f' || k == 'F')
do_flip = !do_flip;
}
cam.release();
destroyAllWindows();
}
소스 코드가 그리 길지는 않죠? 일단 raspicam::RaspiCam_Cv 객체를 생성해서 카메라를 열고, 매 프레임마다 Haar Cascade Classifier로 얼굴을 검출합니다. 속도 향상을 위해서 매 프레임을 가로, 세로 1/2 크기로 줄인 다음에 얼굴을 검출하고, 검출된 얼굴 영역을 화면에 보여줄 때 다시 좌표를 2배 확대합니다. 제가 라즈베리파이에 카메라를 거꾸로 달아놔서 'f' 키를 누르면 영상을 flip 하여 얼굴 검출을 수행합니다.
이제 터미널 창에서 make 명령을 입력하면 프로그램을 빌드하여 facedetect라는 실행 파일을 생성합니다.
위에서 haarcascade_frontalface_default.xml 파일은 OpenCV를 설치할 때 /usr/local/share/OpenCV/haarcascades 디렉토리에 만들어집니다. 그러므로 cp /usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml . 명령으로 현재 폴더로 복사하면 됩니다.
이제 터미널 창에서 ./facedetect 명령으로 프로그램을 실행하면 아래처럼 얼굴을 검출합니다.
왼쪽 상단에 나타난 창은 htop 프로그램인데요, 4개의 코어가 다 동작하는 것을 확인할 수가 있구요... 한 프레임에서 얼굴을 찾는데 대략 130~200 ms 정도의 시간이 걸리는 것을 확인할 수 있습니다.
약간의 속도 향상을 위해서 소스 코드에서 cascade.detectMultiScale(reduced, faces, 1.1, 3, 0, Size(40, 40)); 부분을 cascade.detectMultiScale(reduced, faces, 1.2, 3, 0, Size(60, 60), Size(240, 240)); 형태로 수정하고 프로그램을 다시 돌려보니 조금 빨라졌네요. :-)
라즈베리파이에 OpenCV를 깔았으니 간단한 OpenCV 프로그램을 만들어보겠습니다. 간단한 엣지 검출 예제를 만들어보면서 소스 코드 편집, 빌드, 실행 방법등을 정리해보겠습니다.
일단 저는 소스 코드 편집을 vi 에디터를 사용하는데요, 라즈베리파이에 기본으로 깔리는 vi는 정확하게 vim.tiny 입니다. 그런데 vim.tiny는 syntax coloring을 지원하지 않네요. 그러므로 vim 패키지를 새로 설치했습니다. 명령어는 sudo apt-get install vim입니다.
프로그래밍 테스트를 할 폴더를 하나 만들고, 특히 OpenCV 관련 코딩을 모아놓을 폴더도 하나 만들도록 합니다. 새로 만들 예제 프로그램은 canny라는 이름의 디렉토리에 만들겠습니다.
pi@GoPiGo:~ $mkdir coding && cd coding pi@GoPiGo:~/coding $mkdir opencv && cd opencv pi@GoPiGo:~/coding/opencv $mkdir canny && cd canny pi@GoPiGo:~/coding/opencv/canny $
이 Makefile은 현재 폴더에서 main.cpp 파일을 컴파일하고, OpenCV 라이브러리를 사용하고, 결과 파일 이름은 현재 디렉토리 이름과 동일한 형태로 생성합니다. 즉, 현재 디렉토리 이름이 canny이니까 main.cpp 파일을 빌드해서 canny라는 이름의 실행 파일을 생성합니다. Makefile을 이용해서 빌드를 하려면 터미널 창에서 make라고만 입력하면 됩니다.
순조롭게 canny 실행 파일이 생성이 되었습니다. 이제 ./canny 명령을 입력해서 실행을 하면 아래처럼 2개의 창이 나타나면서 캐니 엣지 검출 결과를 보여줍니다.
참 쉽죠??
그나저나 캐니 엣지 검출기의 실행 속도가 궁금해졌습니다. 그래서 소스 코드에 아래와 같이 캐니 엣지 검출기 실행 시간을 측정해봤습니다.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(void)
{
Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (src.empty()) {
cerr << "Image load failed!" << endl;
return -1;
}
int64 t1 = getTickCount();
Mat dst;
Canny(src, dst, 50, 150);
int64 t2 = getTickCount();
cout << "It took " << (t2 -t1) * 1000 / getTickFrequency() << " ms." << endl;
imshow("src", src);
imshow("dst", dst);
waitKey(0);
return 0;
}
위에서 getTickCount(), getTickFrequency() 함수를 조합해서 Canny() 함수의 실행 시간을 측정하였고, 그 결과는 아래와 같습니다.
자세히 보면 왼쪽 아래 터미널 창에 "It took 12.5726 ms." 라고 출력이 되어 있는 것을 볼 수 있는데요.. 512x512 크기의 영상에 대해서 12msec 정도 걸린 것이니 그렇게 아주 나쁘지는 않은 것 같습니다. 근데 몇 번을 더 해보니까 12ms 시간대로 나오는 경우는 거의 없네요. 대부분 16~24ms 정도로 측정이 되었습니다.
라즈베리파이에서 OpenCV 3.2를 설치하는 방법을 정리해보겠습니다. 라즈베리파이에 OpenCV를 설치한다는 것은 OpenCV 소스 코드를 직접 빌드하여 헤더 파일을 복사하고 OpenCV 라이브러리를 생성하는 작업을 의미합니다. 과정이 좀 길지만 차근차근 알아보겠습니다.
OpenCV 소스 코드를 빌드하려면 빌드 관련 도구나 필요한 라이브러리 패키지를 라즈베리파이에 미리 설치해두어야 합니다. 예를 들어, 정지 영상 포맷과 관련된 jpeg 라이브러리나 png 라이브러리, 비디오 파일 포맷 또는 스트리밍 관련 라이브러리 같은 것들을 미리 설치해야 정상적으로 빌드됩니다.
[빌드 관련 도구 설치] 실제 빌드 작업에 앞서 OpenCV 빌드에 필요한 패키지를 설치합니다.
[파이썬] OpenCV를 빌드한 후 C/C++ 뿐만 아니라 Python으로도 프로그래밍을 테스트하려고 합니다. 개인적으로는 Python 2.x 버전을 사용하지 않고 Python 3.x 버전만 사용할 것이구요.. 이를 위해서 python3-dev 또는 python3-numpy 패키지가 필요한데, 얘네 둘은 이미 설치가 되어 있을 겁니다. (없으면 설치해야죠.)
pi@RaspberryPi3:~/opencv $ mkdir build && cd build
[cmake 구성] 아래 명령어가 좀 긴데요, 대충 보면 예제 파일들을 생성하고, Python 2.x 말고 Python 3.x를 지원하도록 하는 등의 옵션을 지정합니다. Extra 모듈 소스 코드 위치를 지정하고, OpenCV 소스 코드 위치가 ../opencv-3.2.0/ 임을 명시합니다. 그리고 cmake가 동작하면서 나타나는 출력 메시지를 모두 cmake_messages.txt 파일에 기록합니다.
참고로 cmake_message.txt 파일에 기록된 내용을 아래 [더보기]에 정리해두었습니다.
-- General configuration for OpenCV 3.2.0 ===================================== -- Version control: unknown -- -- Extra modules: -- Location (extra): /home/pi/opencv/opencv_contrib-3.2.0/modules -- Version control (extra): unknown -- -- Platform: -- Timestamp: 2017-04-10T20:06:49Z -- Host: Linux 4.9.30-v7+ armv7l -- CMake: 3.6.2 -- CMake generator: Unix Makefiles -- CMake build tool: /usr/bin/make -- Configuration: RELEASE -- -- C/C++: -- Built as dynamic libs?: YES -- C++ Compiler: /usr/bin/c++ (ver 4.9.2) -- C++ flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfp16-format=ieee -mfpu=neon -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden -mfpu=neon-fp16 -O3 -DNDEBUG -DNDEBUG -- C++ flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wshadow -Wsign-promo -Wno-narrowing -Wno-delete-non-virtual-dtor -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfp16-format=ieee -mfpu=neon -ffunction-sections -fvisibility=hidden -fvisibility-inlines-hidden -mfpu=neon-fp16 -g -O0 -DDEBUG -D_DEBUG -- C Compiler: /usr/bin/cc -- C flags (Release): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfp16-format=ieee -mfpu=neon -ffunction-sections -fvisibility=hidden -mfpu=neon-fp16 -O3 -DNDEBUG -DNDEBUG -- C flags (Debug): -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wshadow -Wno-narrowing -Wno-comment -fdiagnostics-show-option -pthread -fomit-frame-pointer -mfp16-format=ieee -mfpu=neon -ffunction-sections -fvisibility=hidden -mfpu=neon-fp16 -g -O0 -DDEBUG -D_DEBUG -- Linker flags (Release): -- Linker flags (Debug): -- ccache: NO -- Precompiled headers: YES -- Extra dependencies: /usr/lib/arm-linux-gnueabihf/libpng.so /usr/lib/arm-linux-gnueabihf/libz.so /usr/lib/arm-linux-gnueabihf/libtiff.so /usr/lib/arm-linux-gnueabihf/libjasper.so /usr/lib/arm-linux-gnueabihf/libjpeg.so gtk-x11-2.0 gdk-x11-2.0 pangocairo-1.0 atk-1.0 cairo gdk_pixbuf-2.0 gio-2.0 pangoft2-1.0 pango-1.0 gobject-2.0 glib-2.0 fontconfig freetype gthread-2.0 gstbase-1.0 gstreamer-1.0 gstvideo-1.0 gstapp-1.0 gstriff-1.0 gstpbutils-1.0 v4l1 v4l2 avcodec avformat avutil swscale avresample dl m pthread rt -- 3rdparty dependencies: libwebp IlmImf libprotobuf tegra_hal -- -- OpenCV modules: -- To be built: core flann imgproc ml photo reg surface_matching video dnn freetype fuzzy imgcodecs shape videoio highgui objdetect plot superres xobjdetect xphoto bgsegm bioinspired dpm face features2d line_descriptor saliency text calib3d ccalib datasets rgbd stereo tracking videostab xfeatures2d ximgproc aruco optflow phase_unwrapping stitching structured_light python3 -- Disabled: world contrib_world -- Disabled by dependency: - -- Unavailable: cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python2 ts viz cnn_3dobj cvv hdf matlab sfm -- -- GUI: -- QT: NO -- GTK+ 2.x: YES (ver 2.24.25) -- GThread : YES (ver 2.42.1) -- GtkGlExt: NO -- OpenGL support: NO -- VTK support: NO -- -- Media I/O: -- ZLib: /usr/lib/arm-linux-gnueabihf/libz.so (ver 1.2.8) -- JPEG: /usr/lib/arm-linux-gnueabihf/libjpeg.so (ver ) -- WEBP: build (ver 0.3.1) -- PNG: /usr/lib/arm-linux-gnueabihf/libpng.so (ver 1.2.50) -- TIFF: /usr/lib/arm-linux-gnueabihf/libtiff.so (ver 42 - 4.0.3) -- JPEG 2000: /usr/lib/arm-linux-gnueabihf/libjasper.so (ver 1.900.1) -- OpenEXR: build (ver 1.7.1) -- GDAL: NO -- GDCM: NO -- -- Video I/O: -- DC1394 1.x: NO -- DC1394 2.x: NO -- FFMPEG: YES -- avcodec: YES (ver 56.1.0) -- avformat: YES (ver 56.1.0) -- avutil: YES (ver 54.3.0) -- swscale: YES (ver 3.0.0) -- avresample: YES (ver 2.1.0) -- GStreamer: -- base: YES (ver 1.4.4) -- video: YES (ver 1.4.4) -- app: YES (ver 1.4.4) -- riff: YES (ver 1.4.4) -- pbutils: YES (ver 1.4.4) -- OpenNI: NO -- OpenNI PrimeSensor Modules: NO -- OpenNI2: NO -- PvAPI: NO -- GigEVisionSDK: NO -- Aravis SDK: NO -- UniCap: NO -- UniCap ucil: NO -- V4L/V4L2: Using libv4l1 (ver 1.6.0) / libv4l2 (ver 1.6.0) -- XIMEA: NO -- Xine: NO -- gPhoto2: NO -- -- Parallel framework: pthreads -- -- Other third-party libraries: -- Use IPP: NO -- Use VA: NO -- Use Intel VA-API/OpenCL: NO -- Use Lapack: NO -- Use Eigen: YES (ver 3.2.2) -- Use Cuda: NO -- Use OpenCL: YES -- Use OpenVX: NO -- Use custom HAL: YES (carotene (ver 0.0.1)) -- -- OpenCL: <Dynamic loading of OpenCL library> -- Include path: /home/pi/opencv/opencv-3.2.0/3rdparty/include/opencl/1.2 -- Use AMDFFT: NO -- Use AMDBLAS: NO -- -- Python 2: -- Interpreter: /usr/bin/python2.7 (ver 2.7.9) -- -- Python 3: -- Interpreter: /usr/bin/python3.4 (ver 3.4.2) -- Libraries: /usr/lib/arm-linux-gnueabihf/libpython3.4m.so (ver 3.4.2) -- numpy: /usr/lib/python3/dist-packages/numpy/core/include (ver 1.8.2) -- packages path: lib/python3.4/dist-packages -- -- Python (for build): /usr/bin/python2.7 -- -- Java: -- ant: NO -- JNI: NO -- Java wrappers: NO -- Java tests: NO -- -- Matlab: Matlab not found or implicitly disabled -- -- Tests and samples: -- Tests: NO -- Performance tests: NO -- C/C++ Examples: YES -- -- Install path: /usr/local -- -- cvconfig.h is in: /home/pi/opencv/build -- ----------------------------------------------------------------- -- -- Configuring done -- Generating done -- Build files have been written to: /home/pi/opencv/build
[빌드!!!] 이제 실제 빌드 작업을 진행합니다. 라즈베리파이3은 4개의 코어가 있지만, -j4 옵션을 주면 발열때문에 문제가 생길까봐 -j2 옵션으로 빌드를 진행합니다. 혹시라도 에러가 발생할까봐 컴파일 메시지는 build_messages.txt 파일에도 저장해둡니다. 빌드 작업은 2시간 넘게 걸렸던 것같고, 간간히 선풍기로 라즈베리파이 보드를 식히면서 진행했습니다.
pi@RaspberryPi3:~/opencv/build/ $ make -j2 2>&1 | tee build_messages.txt
[설치 및 설치 확인] 아래 명령어를 입력한 후 3.2.0 이 출력되면 정상적으로 설치가 된겁니다.
[Python 테스트] python3을 실행하여 OpenCV를 잘 불러오는지 확인해봅니다.
pi@RaspberryPi3:~/opencv/build/ $ python3 Python 3.4.2 (default, Oct 19 2014, 13:31:11) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> print(cv2.__version__) 3.2.0 >>> exit() pi@RaspberryPi3:~/opencv/build/ $
라즈베리파이에서 사용하는 공식 OS 라즈비안 Jessie는 Debian 리눅스 Jessie를 기반으로 라즈베리파이에 맞게끔 커스터마이징된 OS이기 때문에 어쨋든 리눅스입니다. 소스 컴파일도 리눅스답게 gcc 또는 g++을 사용하고, apt-get 같은 명령어를 이용하여 패키지를 설치하구요.
요즘의 리눅스는 GUI가 기본이고 GUI 환경의 파일관리자가 기본으로 제공되지만, 라즈베리파이를 서버처럼 사용하고 주로 putty 같은 터미널 프로그램으로 접속해서 관리하는 경우에는 전통적인 텍스트 환경에서 명령어 기반의 파일 관리를 (어쩔 수 없이) 해야하는 경우가 많습니다. cp, mv, rm, rmdir 같은 명령어를 사용해서 파일을 복사하고 옮기고 지우는 작업을 하는 건데요.. 이것도 익숙해지면 할만하기는 하지만 가끔은 좀 더 편한 인터페이스가 있으면 좋겠다는 생각이 드는건 어쩔 수 없습니다.
그래서 라즈베리파이에서 사용할 수 있는 텍스트 기반 GUI를 지원하는 파일 관리자를 사용하는 방법을 알아보려고 합니다. 제가 설치할 프로그램은 mc와 linm인데요, 먼저 mc부터 설치를 해보겠습니다.
mc는 Midnight Commander라는 이름의 파일 관리 프로그램이구요, https://midnight-commander.org/ 에서 자세한 정보를 얻을 수 있습니다. mc 설치는 apt-get 명령을 이용하여 쉽게 설치할 수 있습니다. 터미널 창에서 sudo apt-get install mc 라고 입력하면 됩니다.
설치가 끝나고 터미널 창에서 mc를 실행하면 다음과 같은 화면이 나타납니다.
화면 색깔이라던가 위에 파일 목록이 나타나고, 아래쪽에 명령어를 입력할 수 있는 콘솔이 나타난다는 등의 모양새가 예전 도스 시절의 norton commander와 거의 유사합니다.
그런데 저는 노턴 코맨더를 사용하던 쪽이 아니었습니다. 주로 mdir을 사용하던 사람이었는데요, 리눅스에서도 이런 대결 구도(?)가 재현되네요. Mdir의 리눅스 클론(?)이 바로 linm 입니다.
저는 라즈베리파이에 linm을 설치할 것이기 때문에 위 페이지에서 linm - 0.8.1-1-0ubuntu12 항목 아래에 있는 linm_0.8.1-1-0ubuntu12_armhf.deb 파일을 다운로드 받았습니다. (https://launchpad.net/~kyu419/+archive/ubuntu/ppa/+files/linm_0.8.1-1-0ubuntu12_armhf.deb) 그리고 이 파일을 FTP 프로그램을 이용하여 제 라즈베리파이로 옮겼습니다. 그리고 putty 프로그램으로 라즈베리파이에 접속해서 sudo dpkg --install linm_0.8.1-1-0ubuntu12_armhf.deb 명령을 입력하여 설치를 진행했습니다. (위에 위키 페이지에서는 zlib1g, openssl, libncurses, libncursesw5, libsmbclient 같은 패키지를 미리 설치해야 한다고 설명이 되어 있습니다만, 라즈베리파이에서 libncurses 같은 패키지가 잘 설치가 안되기도 하고, 또 굳이 얘네들 패키지를 설치하지 않고 곧바로 linm_0.8.1-1-0ubuntu12_armhf.deb 파일을 설치해도 잘 설치가 되더군요.)
설치가 끝나고 터미널 창에서 linm을 입력하면 아래와 같은 화면이 나타납니다.
화면 구성이나 색깔이 예전 도스의 mdir과 똑같습니다. 뭔가 아련한 느낌까지 들 정도네요. ㅎㅎ putty에서 linm을 실행하면 처음에 세로 줄이나 가로줄이 좀 깨지는 경우가 있는데, ALT+L 키를 눌러서 라인 코드를 바꿔주니까 깔끔하게 잘 나타납니다. (또는 F12를 눌러서 옵션 메뉴 아래 라인 코드 바꾸기를 선택하세요.) 화면을 분할하려면 Ctrl+W 키를 눌러주면 됩니다. 프로그램을 종료하려면 Ctrl+Q를 누릅니다.
개인적으로는 linm의 모양새가 더 친근해서 mc 보다는 linm을 사용합니다. 근데 linm은 화살표로 파일간 이동을 할 때 비정상적으로 비프음을 내는 경우가 많습니다. 근까 아래 화살표를 길게 누르다보면 맨 마지막 파일에 다다랐을 때 '딩~' 하는 소리가 나는 것은 그러려니한데, 보통 파일 이동 중간쯤에서도 '딩~' 소리가 나는 경우가 많아서, 뭔가 이상한 느낌을 주게 합니다. (putty의 문제인지...) mc는 그런 오동작이 없고, 또 메뉴 선택이나 파일 선택을 마우스를 이용해서 할 수도 있다는 장점이 있긴 하네요.
제가 2016년 4월에 처음 Kodi를 설치했을 때에는, Kodi 버전이 15였습니다. apt-get install 명령으로 설치를 할 수 있었구요.. 그런데 Kodi에서 유투브 애드온을 설치해서 사용하다보니까 한글 키보드 입력이 되지 않아서, Kodi 소스 코드를 직접 빌드해서 Kodi 버전 16을 설치했었고, 얼마전까지 잘 사용하고 있었습니다. 그러다가 최근에 라즈비안을 새로 설치하면서 Kodi도 새로 설치를 하게 되었네요.
일단 라즈베리파이에 Kodi를 설치하려면 GPU 메모리를 160MB 이상으로 잡아주는 것이 좋습니다. 라즈베리파이 데스크탑 환경에서 [시작메뉴] -> [기본 설정] -> [Raspberry Pi Configuration] 메뉴를 실행하고, 아래 그림과 같이 Performance 탭에서 GPU 메모리를 충분히 크게 잡아줍니다. 물론 터미널에서 sudo raspi-config 명령을 사용해서 수정해도 됩니다.
그 다음부터는 아래 링크의 명령를 순서대로 따르면서 설치를 진행했습니다. 구글링을 꽤 해봤는데, 최신 버전의 Kodi 설치에 대한 글은 그리 많지 않더군요. 그나마 이 블로그의 내용이 가장 잘 정리가 되어있었습니다.
pi@RaspberryPi3:~ $ sudo cat /etc/apt/sources.list deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi deb http://pipplware.pplware.pt/pipplware/dists/jessie/main/binary / # Uncomment line below then 'apt-get update' to enable 'apt-get source' #deb-src http://archive.raspbian.org/raspbian/ jessie main contrib non-free rpi pi@RaspberryPi3:~ $
pi@RaspberryPi3:~ $ sudo usermod -a -G audio pi pi@RaspberryPi3:~ $ sudo usermod -a -G video pi pi@RaspberryPi3:~ $ sudo usermod -a -G input pi pi@RaspberryPi3:~ $ sudo usermod -a -G dialout pi pi@RaspberryPi3:~ $ sudo usermod -a -G plugdev pi pi@RaspberryPi3:~ $ sudo usermod -a -G tty pi
9. (Optional) 만약 Kodi 화면에서 Kodi 종료 뿐만 아니라 시스템 끄기, 시스템 재부팅 등의 메뉴를 추가하고 싶다면 /etc/polkit-1/localauthority/50-local.d/all_users_shutdown_reboot.pkla 파일을 생성하여 아래와 같이 입력
pi@RaspberryPi3:~ $ sudo cat /etc/polkit-1/localauthority/50-local.d/all_users_shutdown_reboot.pkla [Allow all users to shutdown and reboot] Identity=unix-user:* Action=org.freedesktop.login1.*;org.freedesktop.upower.*;org.freedesktop.consolekit.system.* ResultActive=yes ResultAny=yes ResultInactive=yes pi@RaspberryPi3:~ $
10. (Optional) 라즈비안이 부팅하자마자 Kodi를 자동으로 실행하게 하려면, 아래처럼 스크립트를 다운받아 /etc/init.d/kodi 형태로 생성하고, 이를 enable 시킴. 만약 자동 실행을 취소하려면 sudo systemctl disable kodi 명령을 입력.
라즈베리파이를 Samba를 설치하면 Windows 운영체제에서 손쉽게 네트워크 연결을 해서 파일을 읽거나 쓰는 것이 충분히 가능하지만, 경우에 따라서는 FTP 연결이 필요한 경우가 있습니다. 라즈비안 제시를 설치하고 SSH를 enable 설정하면 SFTP를 사용할 수 있는 것으로 알고 있지만, 개인적으로 주로 totalcmd 프로그램의 FTP 기능을 사용하고 있어서 SFTP가 아닌 일반 FTP 서버를 새로 설치하려고 합니다.
라즈베리파이에서 많이들 사용하는 FTP 서버는 vsftp입니다. vsftp를 설치하기 위해서는 터미널에서 sudo apt-get install vsftpd 명령을 입력합니다.
설치가 완료되면 vsftp 데몬의 설정을 일부 수정합니다. vsftp 설정은 /etc/vsftpd.conf 파일에 저장되어 있으며, 텍스트 편집기를 이용하여 아래 2개 설정에 대한 주석을 해제합니다.
write_enable=YES local_umask=022
설정이 완료되었으면 vsftpd를 재시작합니다. 재시작 명령어는 sudo /etc/init.d/vsftpd restart 입니다.
pi@RaspberryPi3:~ $cat /proc/version Linux version 4.9.31-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611) ) #1005 SMP Thu Jun 8 13:02:15 BST 2017 pi@RaspberryPi3:~ $uname -a Linux RaspberryPi3 4.9.31-v7+ #1005 SMP Thu Jun 8 13:02:15 BST 2017 armv7l GNU/Linux
* CPU 정보 보기
pi@RaspberryPi3:~ $cat /proc/cpuinfo processor : 0 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4
processor : 1 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4
processor : 2 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4
processor : 3 model name : ARMv7 Processor rev 4 (v7l) BogoMIPS : 38.40 Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xd03 CPU revision : 4
Hardware : BCM2835 Revision : a02082 Serial : 000000009ff5eecb
가끔 인터넷에서 대용량 파일을 배포할 때 토렌트를 사용하는 경우가 있습니다. 불법적으로 돌아다니는 영화도 주로 토렌트로 공유가 되구요, 우분투나 라즈비안 Jessie 이미지도 토렌트를 이용하여 다운로드 받을 수 있습니다. 사실 토렌트 기술 자체는 꽤 괜찮은 기술이죠. 대용량 파일을 꽤 빠르게 다운받게 해주니까요.
여하튼 라즈베리파이에도 토렌트 클라이언트를 설치할 수 있습니다. 저는 라즈베리파이 하나를 서버처럼 사용할 것이기 때문에 라즈베리파이에 토렌트 클라이언트를 설치해놓으면 밤낮으로 쉬지않고 자료를 다운받게 되니 편리합니다. 라즈베리파이에서 주로 사용되는 토렌트 클라이언트 프로그램은 transmission입니다. transmission 프로그램을 설치하려면 터미널 창에서 sudo apt-get install transmission-daemon 명령어를 입력합니다.
위 그림에서 첫 번째 줄에 쓰여 있는 명령어 dpkg -l | grep transmission 명령은 현재 시스템에 transmission이라는 문자열이 들어가 있는 패키지가 설치되어 있는지를 확인하는 명령입니다. transmission-daemon을 설치했었는지가 문득 헷갈려서..
일단 transmission-daemon 프로그램을 설치하였으면 이번에는 transmission 설정 파일을 일부 편집해야 합니다. transmission-daemon 프로그램의 설정 파일은 /etc/transmission-daemon/settings.json 이고, 관리자 권한으로 수정해야 하므로 sudo vi /etc/transmission-daemon/settings.json 명령어를 입력하여 파일을 수정할 수 있습니다. 다만 이미 실행되고 있는 transmission-daemon을 일단 멈쳐야 합니다. 그러므로 다음과 같은 순서로 명령어를 입력합니다.
pi@RaspberryPi3:~ $sudo /etc/init.d/transmission-daemon stop [ ok ] Stopping transmission-daemon (via systemctl): transmission-daemon.service. pi@RaspberryPi3:~ $sudo vi /etc/transmission-daemon/settings.json
settings.json 파일에서 개인적으로 수정을 하였거나 관심을 가져야할 셋팅 정보를 아래에 정리했습니다.
transmission-daemon을 재시작하였으면 이제 실제로 대용량 파일을 다운받아보겠습니다. 일단 transmission-daemon이 제공하는 웹 인터페이스에 접속을 해겠습니다. 앞서 setting.json 파일에서 rpc-port 라는 것을 9091번을 지정했는데, 웹 브라우저를 이용하여 이 포트로 접속을 하면 transmission 화면이 나타납니다. 예를 들어 위에서 설정한 라즈베리파이에 접속하려면 http://192.168.25.16:9091/ 로 접속을 합니다. 물론 내부 네트웍이니까 외부에서는 접속이 안되구요, 접속을 하면 앞에서 설정한 사용자 이름과 암호를 물어봅니다. 사용자 이름과 암호를 잘 입력하면 아래 그림과 같은 웹사이트로 접속이 되구요..
위 그림에서 주소창 바로 아래 툴바 아이콘 중에서 맨 왼쪽의 폴더 열기 같은 모양의 아이콘이 *.torrent 파일을 추가하는 인터페이스 모양입니다. *.torrent 파일 뿐만 아니라 마그넷 주소도 추가할 수 있습니다. https://www.raspberrypi.org/downloads/raspbian/ 사이트에서 라즈비안 Jessie 토렌트 파일을 다운받고, 다운받은 2017-04-10-raspbian-jessie.zip.torrent 파일을 업로드하면 아래 그림처럼 2017-04-10-raspbian-jessie.zip 파일을 다운로드 시작합니다.