現在、Pythonを勉強中です。 また、生成AIも習うより慣れよと出来る限り使って経験値を高めようとしています。 ということで Gemini を教師として Python のプログラミングを学習していく過程をブログに残していきます。
今回は Webカメラの映像から自動車を認識する処理を作りたいと思います。 具体的には Web カメラに映る風景から自動車を認識しその数を集計するプログラムです。
ただ、結論を先にいうと Gemini から提示されたサンプルコードをそのままでは実行できませんでした。 OpenCV が提供しているはずの haarcascade_car.xml ファイルが現在は利用出来ない状況(OpenCV の GitHub で公開されていない)。 一応、野良?で見つけた haarcascade_car.xml で試している結果は紹介します。
![](https://www.bigriver.jp/wp-content/uploads/2024/05/image-74-1024x499.png)
目次
Gemini に教えてもらう
![bigriver.jp](https://www.bigriver.jp/wp-content/uploads/2019/08/cropped-bigriver.png)
OpenCVでWebカメラの映像から自動車を識別してカウントするプログラムを作りたい
![](https://www.bigriver.jp/wp-content/uploads/2024/05/image-75.png)
![](https://www.bigriver.jp/wp-content/uploads/2024/05/image-76.png)
![](https://www.bigriver.jp/wp-content/uploads/2024/05/image-77.png)
自動車の検出には分類器が必要で OpenCV がもっている haarcascade_car.xml
からカスケード分類器を作れることがわかりました。 ただ、精度を上げるにはディープラーニングなど他の仕組みを使用するのがよいとのこと。
また検出精度を上げるためかと思いますがグレースケールに変換していること、検出には detectMultiScale() を使うこともわかりました。
それでは実際にコードを書いていきます。
コード
コーディングは Github for Copilot の拡張機能をインストールした Visual Studio Code で行っています。 その結果、ほとんどの内容は Copilot から予測および提示されるためあっという間に終わります。 Gemini が提示するコードをそのままコピーペーストすればもっと速いというのはありますが Python に慣れたいため手打ちしています。
import cv2
import os
# loading Cascade Classifier
car_cascade = cv2.CascadeClassifier('haarcascade_car.xml')
# initialize the camera
cap = cv2.VideoCapture(0)
# parameters for counts
car_count = 0
while True:
# read a frame from the camera
ret, frame = cap.read()
# transform the frame to gray scale
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# detect cars
cars = car_cascade.detectMultiScale(gray, 1.1, 2)
# draw rectangles around cars
for (x, y, w, h) in cars:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
# count cars
car_count += len(cars)
# show the frame
cv2.putText(frame, f'Car Count: {car_count}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow('Car Detection', frame)
# 'q' key is pressed
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# release the camera
cap.release()
cv2.destroyAllWindows()
最初に書いた通りこのままでは haarcascade_car.xml が無いため実行するとエラーになります。
[ERROR:0@0.023] global persistence.cpp:519 cv::FileStorage::Impl::open Can't open file: 'haarcascade_cTraceback (most recent call last):
Gemini に上記のエラーを聞いてみると haarcascade_car.xml の在りかについて2つの場所が案内されました。 ただ、最新のOpenCVのフォルダにもなく、GitHubリポジトリにもありませんでした。
2. ファイルのダウンロード
- OpenCVのインストールディレクトリ: OpenCVをインストールしたディレクトリ内に、
haarcascades
というフォルダがあり、その中にhaarcascade_car.xml
が含まれているはずです。- GitHub: もしファイルが見つからない場合は、OpenCVのGitHubリポジトリからダウンロードできます。
とりあえず、Google 検索で見つかった haarcascade_car.xml をカレントディレクトリに配置し実行します。 今度はエラー無く実行が出来ました。
以下の画像は実際に出力されている画像について、スクリーンショット取得後に別途手動でモザイク処理をかけています。 ただ見てわかるとおり自動車ではない箇所にも赤線の矩形が表示されている=その部分を自動車と認識している状態でこれはチューニングなのか抜本的な対処が必要な状況でした。これが haarcascade_car.xml によるものなのか、そもそもディープラーニングなど用いないといけないのか、単純にチューニングが必要なのかはまだ判断がついておりません
![](https://www.bigriver.jp/wp-content/uploads/2024/05/image-78.png)
以上