OpenCV関係
OpenCVのインストール (Jetson Xavier NX編)
2021/9/11 今日は、Xavier NXにOpenCV最新版をインストールしてみる。 Jetson Nanoでも、いっとき、OpenCVをセットアップして、カメラから得られる画像に対して画像処理するテスト動作まではやってみていた。今回、Xavier NXを購入しましたので、これを契機に、せっかくパフォーマンスが高いXavier NXなので、それを活かしてみたい、というところ。
[Jetson Nano]OpenCVからCUDAを使ってみる
https://hikotech.net/post-286/
にも書かれていますが、NVIDIAのJetsonシリーズを折角使うのですから、NVIDIAのGPU (CUDA)を使いたい。 折角のOpenCVの環境なのに、内部的にCPUでしか処理されていない、っていうのはもったいない。 ということで、CUDAを使用するOpenCVをセットアップして使用したい。
AastaNV
https://github.com/AastaNV/JEP/tree/master/script
以下のスクリプトも発見。
Build OpenCV on Nvidia Jetson Nano (mdegans)
https://github.com/mdegans/nano_build_opencv
README.mdを見てみると以下のように。
OpenCV build script for Tegra This script builds OpenCV from source on Tegra (Nano, NX, AGX, etc.). Related thread on Nvidia developer forum here.
How to Install OpenCV 4.5 on NVIDIA Jetson Nano
https://automaticaddison.com/how-to-install-opencv-4-5-on-nvidia-jetson-nano/
まあ、AastaNVさんのスクリプトの方がOpenCVのバージョンも4.5.0と新しいし、更新は2020年12月、NVIDIAのコピーライトもあるので、こちらに準じておくか。
installopencv4.5.0Jetson.shの中を再確認すると、中でsudoしているようなので、sudoは必要なさそう。 また、現在の最新版は4.5.3のようなので、version=4.5.3と編集。 また、sudo sudo … となっているところあるので、それもsudo一つ消した。(細かい話し)
このインストールスクリプトの内容を確認。 インストール時のステップとしては、
- OpenCVに必要なもの一式のインストール
- OpenCV最新版のダウンロード(ソースコード一式)
- ビルド(cmakeから)
- インストール
というところ。
** Install opencv-4.5.3 successfully ** Bye :)
Xavier NXもセットアップしたばかりなので、とりあえず、USBカメラを接続。 /dev/video0出現
cheeseでカメラの動作を確認。OK。
OpenCVのインストール (Jetson Nano編)
Jetson Nanoの標準的な環境でも、普通に、OpenCVをパッケージで導入できるようだが、 「バージョンが古い?」とか、「せっかくのGPUにも対応していない?」などという話が、 ネット上でちらちらと見られるため、最初から、最新のバージョンで、かつ、 GPUを使用できるOpenCV環境を導入してみる。
最新のOpenCV環境の導入は、以下で公開されているスクリプトの実行で一発。
https://github.com/AastaNV/JEP/tree/master/script
$ wget https://github.com/AastaNV/JEP/raw/master/script/install_opencv4.5.0_Jetson.sh $ chmod 775 install_opencv4.5.0_Jetson.sh $ sudo ./install_opencv4.5.0_Jetson.sh opencv
一度は、このままやってみたが、メモリ足らずだろう、途中で、他のターミナル上でも何も動かせず、 リモートログインもできず、にっちもさっちもいかなくなった。 なので、スワップメモリを確保して、やり直した。 以下が、スワップメモリの追加の方法。
https://github.com/JetsonHacksNano/installSwapfile
$ wget https://github.com/JetsonHacksNano/installSwapfile/raw/master/installSwapfile.sh $ chmod 775 installSwapfile.sh $ ./installSwapfile.sh
完了したら、リブートして、以下のコマンドを実行して、スワップメモリが追加されていることを確認。
$ free -m
無事、確認できたら、
$ sudo ./install_opencv4.5.0_Jetson.sh opencv
で、再度、OpenCV 4.5.0のインストールスクリプトを実行。 今回は、時間は結構かかるが、無事、インストール作業が進んで、以下のようなメッセージが最後に出たら、 インストール完了。
** Install opencv-4.5.0 successfully ** Bye :)
$ python3 -c 'import cv2; print(cv2.getBuildInformation())' |grep NVIDIA NVIDIA CUDA: YES (ver 10.2, CUFFT CUBLAS) NVIDIA GPU arch: 53 62 72 NVIDIA PTX archs:
export OPENBLAS_CORETYPE=ARMV8
#include "opencv2/opencv.hpp" #include "opencv2/core/utils/logger.hpp" using namespace cv; int main(int argh, char* argv[]) { VideoCapture cap(0); //cap.set(CAP_PROP_FRAME_WIDTH, 640); //cap.set(CAP_PROP_FRAME_HEIGHT, 720); if(!cap.isOpened()) { return -1; } int width = cap.get(CAP_PROP_FRAME_WIDTH); int height = cap.get(CAP_PROP_FRAME_HEIGHT); int fps = cap.get(CAP_PROP_FPS); std::cout << "VideoCapture is opened." << std::endl; //std::cout < "Width x Height = " << width << " x " << height << "\n"; //printf("WIdth x Height = %d x %d\n", width, height); printf("WIdth x Height = %d x %d, fps = %d\n", width, height, fps); Mat frame; while(cap.read(frame)) { imshow("win", frame); const int key = waitKey(1); if (key == 'q'/*113*/) { std::cout << "dims: " << frame.dims << ", depth(byte/channel): " << frame.elemSize1() << ", channels: " << frame.channels() << std::endl; break; } else if(key == 's'/*115*/) { imwrite("img.bmp", frame); } } destroyAllWindows(); return 0; }