0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Raspberry Pi 2 modelB V1.1でstreamlitカメラサーバー動かしてみる

Last updated at Posted at 2024-12-20

動機

 会社でRaspberry Pi 4を触る機会があって、そういえば家に2とカメラがあることを思い出した。機械学習に使えないかと思って購入してセットアップしたが当時まだ使いこなせていなかった。
 最近はstreamlitやpythonの充実でだいぶやりやすくなったと思う。RasbianOS32bit環境もRaspberry Pi Zero関係で需要があるようなので、動くかトライしてみた。

環境

いわゆるラズパイ2が話題になった頃の化石環境。

Raspberry Pi 2 modelB V1.1
Raspberry Pi Camera Rev1.3 (OV5647)
Rasbian OS 32bit(Bullseye)

カメラの性能は以下である。意外と悪くない。

Size FPS
1080p 30
720p 60
VGA(480p) 90

やったこと

ググると、RaspbianOSの32bitでstreamlitを動かした記事がほとんどない。64bitでやれとか、pyarrowが対応してないとか絶望的な記事が多い。

結論から言うと動いた。バージョンを合わせたビルド済みパッケージのみで根性ビルドは不要。

streamlitのインストール時のポイントはprotobufをダウングレードすること。
下記をバージョン指定で入れてOpenCV、streamlitともにちゃんと動いた。
OpenCVはビルドしなおさなくてもpip installのみでOK。
OpenCVはlibcameraでは使用できないため、レガシーカメラとして設定する。
(この内容はこの記事に書くには長すぎるので省略)
OpenCVから使う場合、「vcgencmd get_camera」コマンドの結果が下記となるようにする。

supported=1 detected=1, libcamera interfaces=0

なお、ラズパイではvenvは使用しないで素のpipインストールをする。いろいろ動かない。

記事末尾にpip freezeの結果を書きました。参考まで。

主要なライブラリのバージョン
numpy : 1.24.1
OpenCV : 4.6.0.66
streamlit : 0.62.0
protobuf : 3.19.0

protobufについてのフォーラム

サンプルコード

Sleep無くしても全く30FPSで表示されないが、とりあえずタイムラプス配信みたいにはできる。

main.py
import streamlit as st
import cv2
import time

cap = cv2.VideoCapture(0)

# キャプチャサイズとフレームレート設定
cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
cap.set(cv2.CAP_PROP_FPS, 30)

# 一応オートで焦点、露出、ホワイトバランス設定しておく
cap.set(cv2.CAP_PROP_AUTOFOCUS, 1)
cap.set(cv2.CAP_PROP_AUTO_EXPOSURE, 1)
cap.set(cv2.CAP_PROP_AUTO_WB, 1)

imgst = st.empty()
# アプリ終了ボタン
exit_app = st.sidebar.button("終了")

while True:
    ret, img = cap.read()
    if ret:
        # OpenCVで得られる画像はBGRなのでstremlit表示用にRGBに
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        # streamlitに流す
        imgst.image(img)

    if exit_app:
        # ボタン押下で抜ける
        break

    # あんまりサッサカ取得すると固まるので待つ
    time.sleep(1)

cap.release()
cv2.destroyAllWindows()
print("End streamlit application.")

streamlit run main.py --browser.gatherUsageStats false

※ラズパイで確認用のブラウザが立ち上がるとうざいので引数追加

こんな感じ

逆光だとなかなかひどい画で。
定点カメラとしては優秀か。streamlitのいい点はスマホで簡単にアクセスできるところ。

cap_streamlit.png

requirements参考

動作したpipのrequirements一式を書き出しておく。(関係ないのも交じってますが)

requirements.txt
requirements.txt
altair==5.5.0
appdirs==1.4.4
arandr==0.1.10
astor==0.8.1
astroid==2.5.1
asttokens==2.0.4
attrs==24.2.0
autobahn==17.10.1
Automat==20.2.0
automationhat==0.2.0
backcall==0.2.0
base58==2.1.1
bcrypt==3.1.7
beautifulsoup4==4.9.3
blinker==1.4
blinkt==0.1.2
boto3==1.35.81
botocore==1.35.81
buttonshim==0.0.2
cachetools==5.5.0
Cap1xxx==0.1.3
cbor==1.0.0
certifi==2020.6.20
chardet==4.0.0
click==7.1.2
colorama==0.4.4
colorzero==1.1
constantly==15.1.0
cryptography==3.3.2
cupshelpers==1.0
cycler==0.10.0
Cython==0.29.21
dbus-python==1.2.16
decorator==4.4.2
distro==1.5.0
dnspython==2.0.0
docutils==0.16
drumhat==0.1.0
enum-compat==0.0.3
envirophat==1.0.0
ExplorerHAT==0.4.2
Flask==1.1.2
fourletterphat==0.1.0
gpg===1.14.0-unknown
gpiozero==1.6.2
guizero==1.1.1
html5lib==1.1
hyperlink==19.0.0
idna==2.10
incremental==17.5.0
ipykernel==5.4.3
ipython==7.20.0
ipython_genutils==0.2.0
isort==5.6.4
itsdangerous==1.1.0
jedi==0.18.0
Jinja2==2.11.3
jmespath==1.0.1
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
jupyter-client==6.1.11
jupyter-core==4.7.1
kiwisolver==1.3.1
lazy-object-proxy==0.0.0
logilab-common==1.8.1
lxml==4.6.3
lz4==3.1.3+dfsg
Markdown==3.3.4
MarkupSafe==1.1.1
matplotlib==3.3.4
mccabe==0.6.1
microdotphat==0.2.1
mock==4.0.3
mote==0.0.4
motephat==0.0.3
mpi4py==3.0.3
mypy==0.812
mypy-extensions==0.4.3
narwhals==1.18.3
nudatus==0.0.5
numpy==1.24.1
oauthlib==3.1.0
opencv-python==4.6.0.66
packaging==24.2
pandas==2.2.3
pantilthat==0.0.7
parso==0.8.1
pbr==5.5.0
pexpect==4.8.0
pgzero==1.2
phatbeat==0.1.1
pianohat==0.1.0
picamera==1.13
picamera2==0.3.12
pickleshare==0.7.5
pidng==4.0.9
piexif==1.1.3
piglow==1.2.5
pigpio==1.78
Pillow==8.1.2
prompt-toolkit==3.0.14
protobuf==3.19.0
psutil==5.8.0
py-ubjson==0.16.1
pyasn1==0.4.8
pyasn1-modules==0.2.1
pycairo==1.16.2
pycodestyle==2.6.0
pycups==2.0.1
pydeck==0.9.1
pyflakes==2.2.0
pygame==1.9.6
Pygments==2.7.1
PyGObject==3.38.0
PyHamcrest==1.9.0
pyinotify==0.9.6
PyJWT==1.7.1
pylint==2.7.2
PyNaCl==1.4.0
PyOpenGL==3.1.5
pyOpenSSL==20.0.1
pyparsing==2.4.7
pypng==0.0.20
PyQRCode==1.2.1
PyQt5==5.15.2
PyQt5-sip==12.8.1
pyserial==3.5b0
pysmbc==1.0.23
python-apt==2.2.1
python-dateutil==2.9.0.post0
python-prctl==1.7
python-snappy==0.5.3
PyTrie==0.2
pytz==2024.2
PyYAML==5.3.1
pyzmq==20.0.0
QScintilla==2.11.6
qtconsole==5.0.2
QtPy==1.9.0
rainbowhat==0.1.0
referencing==0.35.1
reportlab==3.5.59
requests==2.25.1
requests-oauthlib==1.0.0
requests-toolbelt==0.9.1
responses==0.12.1
roman==2.0.0
rpds-py==0.22.3
RPi.GPIO==0.7.0
RTIMULib==7.2.1
s3transfer==0.10.4
scipy==1.6.0
scrollphat==0.0.7
scrollphathd==1.2.1
semver==2.10.2
Send2Trash==1.6.0b1
sense-emu==1.2
sense-hat==2.6.0
service-identity==18.1.0
simplejpeg==1.6.4
simplejson==3.17.2
six==1.16.0
skywriter==0.0.7
sn3218==1.2.7
soupsieve==2.2.1
spidev==3.5
ssh-import-id==5.10
streamlit==0.62.0
thonny==4.0.1
toml==0.10.1
tornado==6.1
touchphat==0.0.1
traitlets==5.0.5
Twisted==20.3.0
twython==3.8.2
txaio==20.4.1
typed-ast==1.4.2
typing_extensions==4.12.2
tzdata==2024.2
tzlocal==5.2
u-msgpack-python==2.3.0
uflash==1.2.4
unicornhathd==0.0.4
urllib3==1.26.5
v4l2-python3==0.3.2
validators==0.34.0
watchdog==6.0.0
wcwidth==0.1.9
webencodings==0.5.1
Werkzeug==1.0.1
wrapt==1.12.1
wsaccel==0.6.2
zope.interface==5.2.0
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?