忘備録など

忘備録として

ヴぃで@

import os
# protobuf の C++ 実装ではなく純 Python 実装を使う
os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python"

import cv2
import mediapipe as mp

CAM_URL = "http://192.168.0.23:8080/video" # ご自身のURLに置き換えてください

def classify_rps(landmarks):
# 親指以外の指先インデックス
tips = [8, 12, 16, 20]
count = 0
for tip in tips:
# y座標が基準(関節2つ下)より上(カメラ視点では小さい)なら「伸びている」
if landmarks[tip].y < landmarks[tip - 2].y:
count += 1

# しきい値に応じて分類
if count >= 4:
return "Paper"
if count == 2:
return "Scissors"
if count <= 1:
return "Rock"
# ここでは count==3 のときなどを「Unknown」に
return "Unknown"

def main():
cap = cv2.VideoCapture(CAM_URL)
if not cap.isOpened():
print(f"ERROR: Cannot open stream at {CAM_URL}")
return

mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

with mp_hands.Hands(
max_num_hands=2,
min_detection_confidence=0.7,
min_tracking_confidence=0.5
) as hands:
while True:
ret, frame = cap.read()
if not ret:
break

frame = cv2.flip(frame, 1)
h, w, _ = frame.shape
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = hands.process(rgb)

if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
xs = [lm.x for lm in hand_landmarks.landmark]
ys = [lm.y for lm in hand_landmarks.landmark]
x_min, x_max = int(min(xs) * w), int(max(xs) * w)
y_min, y_max = int(min(ys) * h), int(max(ys) * h)
cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)

text = classify_rps(hand_landmarks.landmark)
cv2.putText(frame, text, (x_min, y_min - 10),
cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 2)

mp_drawing.draw_landmarks(
frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)

cv2.imshow("Hand RPS Detection", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()

if __name__ == "__main__":
main()

# hand_rps.py

import os
# must set before importing protobuf‐based libs
os.environ['PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION'] = 'python'

import cv2
import mediapipe as mp

# --- 設定 ---
# IP Webcam の動画ストリーム URL
CAM_URL = "http://192.168.0.153:8080/video"

# MediaPipe Hands 初期化
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
static_image_mode=False,
max_num_hands=1,
min_detection_confidence=0.6,
min_tracking_confidence=0.5)
mp_draw = mp.solutions.drawing_utils

# 手の指先と PIP 関節の landmark インデックス
FINGER_TIPS = [4, 8, 12, 16, 20]
FINGER_PIPS = [3, 6, 10, 14, 18]

# --- キャプチャ開始 ---
cap = cv2.VideoCapture(CAM_URL)
if not cap.isOpened():
print(f"ERROR: Cannot open stream at {CAM_URL}")
exit(1)

while True:
ret, frame = cap.read()
if not ret:
break

# ミラー表示
frame = cv2.flip(frame, 1)
h, w, _ = frame.shape

# BGR→RGB→処理→戻す
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
result = hands.process(rgb)

if result.multi_hand_landmarks:
for hand_landmarks in result.multi_hand_landmarks:
# ランドマーク描画
mp_draw.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)

# バウンディングボックス計算
xs = [lm.x for lm in hand_landmarks.landmark]
ys = [lm.y for lm in hand_landmarks.landmark]
x_min, x_max = int(min(xs) * w), int(max(xs) * w)
y_min, y_max = int(min(ys) * h), int(max(ys) * h)
cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)

# 指の伸びチェック
cnt = 0
for tip_idx, pip_idx in zip(FINGER_TIPS, FINGER_PIPS):
if hand_landmarks.landmark[tip_idx].y < hand_landmarks.landmark[pip_idx].y:
cnt += 1

# グー/チョキ/パー判定
if cnt == 0:
gesture = "Rock ✊"
elif cnt == 2:
gesture = "Scissors ✌️"
elif cnt >= 4:
gesture = "Paper 🖐"
else:
gesture = "Unknown 🤷"

# テキスト描画
cv2.putText(frame, gesture, (x_min, y_min - 10),
cv2.FONT_HERSHEY_SIMPLEX, 1.0, (255, 0, 0), 2)

cv2.imshow("Hand RPS Detection", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()
hands.close()



cnt = 0
for tip, pip in zip(FINGER_TIPS, FINGER_PIPS):
if hand_landmarks.landmark[tip].y < hand_landmarks.landmark[pip].y:
cnt += 1

if cnt == 0: gesture = "Rock"
elif cnt == 2: gesture = "Scissors"
elif cnt >= 4: gesture = "Paper"
else: gesture = "Unknown"

Ender-3の画面が青いままになった時の対処法('ω')ノ

Ender-3の画面が青いまま先に進まなくなってしまいました。
ボタンを押しても反応せず。。。  

青いまま!!!

Xにて、ファームウェアの問題と教えていただいたので、
こちらの記事を参考にさせていただきました。

note.com

手順は全部一緒です。SDカードにファイルを入れて差すだけでした。
ただ、こちらの記事はEnder3xなので、私の無印Ender-3ではうまくいきませんでした。

Ender-3無印の場合は、こちらのサイトの
www.creality.com


「Ender-3Marlin2.0.6HW4.2.2」をダウンロードして入れます。

これでうまくいきました!('ω')ノ

印刷も問題なかったです

【一発】Googleアドセンス審査に通りました('ω')ノ

なんとGoogle AdSenseに通りました!!!びっくりです!!!
他の方の記録に色々助けられたので、このブログについても少し記載していきます('ω')ノ

このブログ、2021年の夏前(ちょうど3年前)から始めて、2~3か月で放置していました
ブログ投稿日数20、記事数は22本でした

毎日0~10のアクセスしかありませんが、3年間蓄積されて合計1500アクセスとなっていました('ω')ノ
塵も積もれば山となるとはこのことですね('ω')ノ

ちりつも

アクセス数1500……
ブログ開設して間もない頃には考えてもいなかったGoogle AdSenseの審査、今なら通るんじゃないか???と思い通してみることにしました('ω')ノ

はてなブログは無料版を使っているので、独自ドメインではありません
落ちたらドメイン考えるか…と思っていました('ω')ノ

審査前にやったこと
①プライバシーポリシーの記事を追加する

pokonorakugaki2341.com

上記のサイト様からプライバシーポリシーの本文をコピペし、「プライバシーポリシー」という名前で記事を作りました('ω')ノ

②お問い合わせフォームを作る

お名前、メアド、お問い合わせ内容を記入できるものをgoogleフォームでつくり、サイドバーに埋め込みました('ω')ノ

Googleフォーム
リンク
カテゴリの下に置いています

やったことはこれだけです('ω')ノ
そのあとアドセンス審査の手順を踏んで結果を待ちました('ω')ノ

4月7日に申し込んで、6日後の4月13日メールが来ました('ω')ノ

きましたーーー

アドセンス画面が変わり、レポートを見ることができるようになりました('ω')ノ

当たり前ですが0です

ということで、3年放置したブログでもアドセンス審査通るよ~という話でした('ω')ノ

OpenCv・PyTorchのインストール('ω')ノ

まずはOpenCvのインストール('ω')ノ

pip install opencv-python とコマンド入力でOK

pythonを開き、import cv2 でインストールできてることを確認
print(cv2)でモジュールのパスを出します('ω')ノ
f:id:riderid:20210811211735j:plain

jupyter notebookのほうで、sysモジュールをインポートします
sys.path.append("先ほどのパス名")でライブラリに追加。これでOKです
削除するときはappendをremoveに変えればいいです

f:id:riderid:20210811211947j:plain

パスを通したので、cv2モジュールが使えるようになりました('ω')ノ

f:id:riderid:20210811212159j:plain

f:id:riderid:20210811212212j:plain
フリー素材ねこさんであそんだり


次にPyTorchをインストール('ω')ノ
PyTorch公式サイトに飛びます
pytorch.org

すると次の画面になるので、自分の環境とpipを選択して、下のコマンドをコピーします
f:id:riderid:20210811212818j:plain

そのまま貼り付けるとエラーが出ました

1つ目は+や=と文字の間にスペースがある問題です
エラー文は「Invelid requirement: '===(+)'」です
いらない空白を削除するとちゃんと読み込んでくれます('ω')ノ
f:id:riderid:20210811212852j:plain

2つ目はパス名が長すぎ問題です
エラー文は「Could not install packages due to an OSError: [Error2] No such file or dir ~~~」
パス名は約260文字までで制限があるらしく、解決するには制限を解除する必要があります
f:id:riderid:20210811213555j:plain

レジストリエディタで、HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/control/FileSystemと選んでいきます
そこのLongPathsEnabledをクリックします
f:id:riderid:20210811213748j:plain

値を0→1に書き換えて終了です
f:id:riderid:20210811214052j:plain

PyTorchも無事インストールできました('ω')ノ
少し触ってみましたが、TensorFlowのほうがよかったなあ('ω')ノ

Arduino・ラズパイ破損

ラズパイとArduinoを壊しました。。。(´;ω;`)
ついでに電源モジュールも壊れました

未だご存命の時の電源モジュール

本日は反省会です。。。

Arduinoを壊した理由は、ACアダプタを5Vではなく12V のものを使ってしまったからです。。(´;ω;`)
いつも通りのものを使ってたつもりだったのに、アダプタ、よく見ると12Vだった!!!!
間違えちゃった(´;ω;`)
煙が出てめっちゃくさかった!!!!!

焦げました。。

ラズパイ(モデル3)を壊した理由は、電源をいれたままGPIOをいじってしまったからです。。
3.3vのところにサーボモーターの+端子を付けた瞬間電源が落ちました(´;ω;`)

ウソみたいだろ。死んでるんだぜ。これで…

それから電源を抜き差ししたものの、赤いLEDは点灯するけど黄緑のランプは光らず。。。
本体がやられました。。
中のデータが消えてないか、青ざめながらモデル4のほうにSDカードを差し直したら無事起動しました(´;ω;`)
よかったーーーー
SDカードの破損ではなかったようです('ω')ノ
これからはデータはちゃんと外部USBに保存することにします('ω')ノ
もうこんな思いはしたくない。。怖かったぜ。。

反省!!!!!

ラズパイでUSBマイクを使ってみる('ω')ノ

前回、ウサギさんにかわいくしゃべってもらうことに成功しました('ω')ノ

riderid.hatenablog.com

ただ、こっちが一方的に話して相槌を打ってもらうだけだったので、今回は私が話しかけた言葉に反応してしゃべってもらうことにします('ω')ノ

絶対かわいい。。。♡

 

準備するのはUSBマイクです('ω')ノ

f:id:riderid:20210729213107j:plain

 

 ラズパイのUSB端子に差し込みます('ω')ノ

f:id:riderid:20210802135957j:plain

 

コマンドでlsusbと打って、マイクが認識されているか確認します('ω')ノ

f:id:riderid:20210802140038j:plain

 

確認したら、juilusをインストールします('ω')ノ

juliusというフォルダを作って、githubから引っ張ってきます

 

こちらのサイトを参考にさせていただきました→

Raspberry PiとJuliusで特定の単語を認識させる | パソコン工房 NEXMAG

 

wget https://github.com/julius-speech/julius/archive/v4.4.2.1.tar.gz と打ってファイルをダウンロードし、解凍します

f:id:riderid:20210802140802j:plain

 

解凍したファイルの中からjulius-4.4.2.1に移動し、ライブラリを入れます

sudo apt-get install libasound2-dev libesd0-dev libsndfile1-dev

f:id:riderid:20210802142856j:plain

 

julius -C main.jconf -C am-gmm.jconf -demo で実行します

「こんにちは」の音声を認識してくれました('ω')ノ

f:id:riderid:20210802143338j:plain

 

pythonで書いてみます

最初に先ほどのjulius -C main.jconf -C am-gmm.jconf -demoに-moduleを付け、moduleモードで実行します('ω')ノ

f:id:riderid:20210802143433j:plain

 

pythonのコードは次の通りです('ω')ノ

f:id:riderid:20210802145838j:plain

f:id:riderid:20210802145947j:plain

f:id:riderid:20210802145823j:plain

f:id:riderid:20210802150028j:plain

f:id:riderid:20210802145805j:plain

f:id:riderid:20210802150054j:plain

 

認識された音声によって、lcdに文字を表示して、うさぎさんがしゃべるようになっています

lcdの部分はosoyooさんのサンプルコードを少しいじったものです

適当にくっつけました('ω')ノ

f:id:riderid:20210802151030j:plain

 

LEDが光っているのはまた別なので、プログラム中には記載ないです


www.youtube.com

 

次はどうしようかなあ。。('ω')ノ