Ubuntu 22.04 OpenCVをVNCで表示

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ポートフォワーディングでやるのは今は無理っぽいのがわかった

VNC クライアント(ubuntu)

VNC サーバ構築
で作成した fedora13 へ 今度は ubuntu からアクセスしてみました
Windwos の場合、ssh 接続にはアプリケーションを使いますが
Linux の場合は
SSH接続(番号変更の場合)
に記載したように、端末からコマンドを使いアクセスできます
今回も同様に
ubuntu からアクセスするには
vncviewer コマンドを使いアクセスします
ただ、そのままでは使えませんので
システム > システム管理 > Syanptic パッケージマネージャー

検索画面で
vncviewer を検索し、インストール指定します
その後、インストールされたら、
vncviewer ホスト名:ディスプレイ番号
でログインできます
もちろん、
vncviewer IPアドレス:ディスプレイ番号
でも可能です
fedora からアクセスするには
LinuxでVNCサーバにアクセスするには
にあるように、
yum install vnc
でインストールしたあとに同様にアクセスすることでできると
思われます

VNC サーバ構築

Windows 7 から 無線LANで fedora13 を操作するために
VNC サーバを構築してみました
参考サイトは
VNCサーバーインストール
です
VNCSERVERS=”1:fedora”
の部分ですが、すでに作成してあるユーザでないとダメでした
もし、存在しないようでしたら
useradd コマンドで作成しましょう
クライアントに使用しているPCは
ネットブックですので、
画面解像度はそのままにしました
VNCSERVERARGS[1]=”-geometry 800×600 -nolisten tcp -nohttpd”
10.1 インチですので、これでもまだ大きいです
vncpasswd

VNC用パスワード設定するときには
su – ユーザ名
としてからパスワード作成しないとだめのようです
ほぼサイトどおりに進めれば問題ないのですが
通常の設定ですと、デフォルトでファイアウォールが設定されているため
アクセスしても弾かれます
このため、VNCで接続するまえに
/etc/rc.d/init.d/iptables stop
でファイアウォールを停止する
もしくは
ファイアウォール設定が必要になります
今回の実験では
Tera Term
を使ってログインし、
/etc/rc.d/init.d/iptables stop
でファイアウォールを停止
setenforce 0
で SELinux を停止してログインしました
なお、Tera term の使用方法については、
TeraTermProでサーバーにSSH接続

TeraTerm によるサーバリモート接続
が参考になると思います
基本的には、リモート操作は
fedora もしくは ubuntu で ssh 接続しますので
ほとんど使うことはなかったのですが、
これからは少しWindows も使うかもしれません