Ubuntu 22.04 OpenCVをVNCで表示
ssh snowpool@192.168.1.69
でログイン
Opencvの処理をSSHで表示するには
ポートフォワーディングが必要
sudo vim /etc/ssh/sshd_config
で
X11Forwarding yes
となっているのを確認
一度ログアウト
ssh -X snowpool@192.168.1.69
とオプションに -X をつければOK
OpenCV については
既にソースからインストール済み
wget https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
で
Haar Cascadeファイルの取得
次にpixcel8で自分の写真を撮影し
GoogleDrive へアップロード
これをubuntuに転送する
scp PXL_20231208_210913098.jpg-20231208T211055Z-001.zip snowpool@192.168.1.69:/home/snowpool/aw10s/
ファイル名が長いので変更
圧縮されているので
unzip PXL_20231208_210913098.jpg-20231208T211055Z-001.zip
で解凍後
mv PXL_20231208_210913098.jpg image.jpg
でファイル名変更
あとは
vim face_recognition.py
でファイルを作成
import cv2 # 分類器の読み込み face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 画像の読み込み img = cv2.imread('image.jpg') # グレースケール変換 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 顔の検出 faces = face_cascade.detectMultiScale(gray, 1.1, 4) # 顔の周囲に枠を描画 for (x, y, w, h) in faces: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # 結果の表示 cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows()
を保存し
実行したら
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') SystemError: <class 'cv2.CascadeClassifier'> returned a result with an exception set
となる
原因は
https://qiita.com/hatorijobs/items/df2c8793509430f8d543
にあるように
githubのhaarcascade_frontalface_default.xmlをダウンロードして、読み込むとエラーになる。
そのため、公式サイトのhaarcascade_frontalface_default.xmlファイルをダウンロードして、
読み込んだら、成功
とのこと
結構chatgptだけだとヒントにはなるけどエラーが多い
普通に
ubuntu22.04 OpenCV 顔認識で検索し
https://techlog.mydns.jp/?p=417
を参考に
https://github.com/opencv/opencv/tree/master/data/haarcascades
から
haarcascade_eye.xml
haarcascade_frontalface_default.xml
をダウンロード
これをubuntu に転送する
scp haarcascade_* snowpool@192.168.1.69:/home/snowpool/aw10s/
そして
pip install opencv-python
でライブラリインストール
vim kao.py
でファイルを作成
import cv2 import time # Haar Cascade分類器の読み込み face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') # Webカメラの設定 cap = cv2.VideoCapture(0) # 0番目のカメラを使用する場合 # 最後の顔検出時刻 lastTime = None # メインループ while True: # カメラからのフレームの取得 ret, frame = cap.read() # フレームのグレースケール化 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 顔の検出 faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # 検出された顔、目、鼻、口に矩形を描画 for (x, y, w, h) in faces: # 検出自の処理(検出から1分たったら再度イベント動かす if lastTime is None or time.perf_counter() - lastTime > 60: # 検出時刻更新 lastTime = time.perf_counter() print("人間発見、警戒せよw") cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) roi_gray = gray[y:y+h, x:x+w] roi_color = frame[y:y+h, x:x+w] # 以下は目もマークする場合 # eyes = eye_cascade.detectMultiScale(roi_gray) # for (ex, ey, ew, eh) in eyes: # cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (255, 0, 0), 2) # 結果の表示 cv2.imshow('Facial Feature Detection', frame) # 終了のキー入力 if cv2.waitKey(1) & 0xFF == ord('q'): break # 後処理 cap.release() cv2.destroyAllWindows()
これで実行したけど
[ WARN:0@0.046] global cap_v4l.cpp:982 open VIDEOIO(V4L2:/dev/video0): can't open camera by index [ WARN:0@0.046] global obsensor_stream_channel_v4l2.cpp:82 xioctl ioctl: fd=-1, req=-2140645888 [ WARN:0@0.046] global obsensor_stream_channel_v4l2.cpp:138 queryUvcDeviceInfoList ioctl error return: 9 [ WARN:0@0.047] global obsensor_stream_channel_v4l2.cpp:82 xioctl ioctl: fd=-1, req=-2140645888 [ WARN:0@0.047] global obsensor_stream_channel_v4l2.cpp:138 queryUvcDeviceInfoList ioctl error return: 9 [ WARN:0@0.047] global obsensor_stream_channel_v4l2.cpp:82 xioctl ioctl: fd=-1, req=-2140645888 [ WARN:0@0.047] global obsensor_stream_channel_v4l2.cpp:138 queryUvcDeviceInfoList ioctl error return: 9 [ WARN:0@0.047] global obsensor_stream_channel_v4l2.cpp:82 xioctl ioctl: fd=-1, req=-2140645888 [ WARN:0@0.047] global obsensor_stream_channel_v4l2.cpp:138 queryUvcDeviceInfoList ioctl error return: 9 [ERROR:0@0.047] global obsensor_uvc_stream_channel.cpp:156 getStreamChannelGroup Camera index out of range Traceback (most recent call last): File "/home/snowpool/aw10s/kao.py", line 22, in <module> gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.error: OpenCV(4.8.0) /io/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'
となる
とりあえずリモートでopencvからやる
import cv2 bgr = cv2.imread(‘image.jpg') cv2.imshow("", bgr) cv2.waitKey(0) cv2.destroyAllWindows()
を
vim test_opencv.py
として保存
https://www.kkaneko.jp/tools/ubuntu/opencv.html
を参考に実行
しかし
bgr = cv2.imread('image,jpg') [ WARN:0@168.990] global loadsave.cpp:248 findDecoder imread_('image,jpg'): can't open/read file: check file path/integrity >>>
となる
pyenvのPythonと組み合わせるOpenCVのビルド: Ubuntu-22.04編
を参考に
#!/usr/bin/env python import os import sys sys.path.insert(0, f"{os.environ['HOME']}/dev-root/opencv4/lib/python3.11/site-packages") import cv2 print(cv2.__version__)
を実行したら
4.8.0
となるので
これは問題ないみたい
https://www.kkaneko.jp/tools/ubuntu/opencv.html
を参考に
import cv2 bgr = cv2.imread('fruits.jpg') cv2.imshow("", bgr)
まで実行すると
cv2.error: OpenCV(4.8.0) /io/opencv/modules/highgui/src/window.cpp:1272: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
となる
これを検索すると
https://qiita.com/tik26/items/a75e03e523926cd2f059
にそれらしいものがあったので
一度OpenCV をアンインストール
sudo apt update sudo apt install -y libgtk2.0-dev pkg-config pip3 install opencv-python
今度は
qt.qpa.xcb: could not connect to display qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/snowpool/.local/lib/python3.10/site-packages/cv2/qt/plugins" even though it was found. This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. Available platform plugins are: xcb. 中止 (コアダンプ)
となる
エラーメッセージを検索すると
QtとOpenCVの両方をインストールするとエラーが発生する[Python]
https://blog.nplpl.com/421
によれば
どうやら双方にGUI機能が含まれているから競合しているらしいので
opencv-python をアンインストール
GUI機能を含まない、OpenCVのヘッドレス版をインストール
でOKらしい
pip uninstall -y opencv-python pip3 install opencv-python-headless
今度は
cv2.error: OpenCV(4.8.0) /io/opencv/modules/highgui/src/window.cpp:1272: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvShowImage'
となる
https://keep-loving-python.hatenablog.com/entry/2023/02/05/110149
によれば
python -m pip install opencv-python==4.6.0.66 --force-reinstall
というように
--force-reinstall
すればOKらしいが
その前に一度cmake をもう一度やってからにしてみる
とりあえずパスを調べる
ChatGPT によれば
import cv2 print(cv2.__file__)
で
Pythonでインストールされている場合のパスが出る
/usr/local/lib/python3.10/dist-packages/cv2/__init__.py
次にapt などの場合
sudo dpkg -L libopencv-dev
で表示
/. /usr /usr/bin /usr/bin/opencv_annotation /usr/bin/opencv_interactive-calibration /usr/bin/opencv_model_diagnostics /usr/bin/opencv_version /usr/bin/opencv_visualisation /usr/bin/opencv_waldboost_detector /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/cmake /usr/lib/x86_64-linux-gnu/cmake/opencv4 /usr/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig-version.cmake /usr/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVConfig.cmake /usr/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVModules-release.cmake /usr/lib/x86_64-linux-gnu/cmake/opencv4/OpenCVModules.cmake /usr/lib/x86_64-linux-gnu/pkgconfig /usr/lib/x86_64-linux-gnu/pkgconfig/opencv4.pc /usr/share /usr/share/doc /usr/share/doc/libopencv-dev /usr/share/doc/libopencv-dev/copyright /usr/share/licenses /usr/share/licenses/opencv4 /usr/share/licenses/opencv4/SoftFloat-COPYING.txt /usr/share/man /usr/share/man/man1 /usr/share/man/man1/opencv_createsamples.1.gz /usr/share/man/man1/opencv_haartraining.1.gz /usr/share/man/man1/opencv_performance.1.gz /usr/share/man/man1/opencv_traincascade.1.gz /usr/share/doc/libopencv-dev/changelog.Debian.gz
確かソースビルドのはず
で
メモを見たが
https://www.kkaneko.jp/tools/ubuntu/ubuntu_opencv.html#S1
にあるようなログ
つまり
Make のオプションがhistoryコマンドで出ない
つまりpythonでは入っているが
Make して入っていないようだ
次にVNC接続し実験
ubuntuで
tigervncserver -xstartup /usr/bin/gnome-session -geometry 800x600 -localhost no :1
を実行後
Mac の場合
Finder から
移動 > サーバーに接続で
vnc://192.168.1.69:5901
で接続
すると
import cv2 bgr = cv2.imread('fruits.jpg') cv2.imshow("", bgr)
まで実行すると
Failed to load module "canberra-gtk-module"
とエラーが変わる
これを検索
OpenCVを実行するとでてくるFailed to load module “canberra-gtk-module”というエラーの対処法
によれば
sudo apt-get install libcanberra-gtk*
でOK
これで
再度
import cv2 bgr = cv2.imread('fruits.jpg') cv2.imshow("", bgr) waitKey(0)
でフルーツ画像が表示される
消すには
cv2.destroyAllWindows()
を実行
とりあえずVNCではできるけど
Ssh Xポートフォワーディングでやるのは今は無理っぽいのがわかった