mei_13のPython講座 ロゴ

【解説】PythonとOpenCVで始める、画像認識と画像処理の第一歩




🐍 初心者歓迎!月額4,000円で質問し放題のPython講座
(1時間4,000円の伴走型ビデオチャット指導も受付中!)
🚀 講座の詳細を見る 📩 質問・お問い合わせ

PythonとOpenCVで始める、画像認識と画像処理の第一歩


Yukiのアイコン
【Yuki】 Hirokiくん、こんにちは。今日は画像処理の世界で最も有名なライブラリの一つ、OpenCVについて一緒にお勉強しましょうか。 少し難しい分野に感じるかもしれませんが、Pythonを使えば初心者の方でも驚くほど簡単に高度な処理ができるようになるんですよ。ゆっくり進めていきますので、安心してくださいね。


Hirokiのアイコン
【Hiroki】 Yukiさん、よろしくお願いします!OpenCVって名前は聞いたことがあります。カメラで顔を追いかけたり、写真にフィルターをかけたりする時に使うんですよね?僕にも扱えるようになりますか?


Yukiのアイコン
【Yuki】 はい、もちろんです。OpenCVは「Open Source Computer Vision Library」の略で、もともとはIntelによって開発されたライブラリなんです。 画像や動画をコンピューターが理解できる「数値の集まり」として扱うための機能が、たくさん詰め込まれているんですよ。 今日は、基本的な画像の扱い方から、AIのような顔認識の入り口までを体験してみましょう。

OpenCVとは何か、なぜ重要なのか


Yukiのアイコン
【Yuki】 まず、なぜOpenCVがこれほどまでに普及しているのかを少しお話ししますね。 画像というのは、私たちの目には綺麗な写真に見えますが、コンピューターにとっては色のデータが並んだ巨大な数字の表でしかありません。 この膨大な数字を、一つ一つ手作業で計算して加工するのはとても大変なんです。


Hirokiのアイコン
【Hiroki】 数字の表……あ、以前プログラミングで配列というのを習いましたが、それと同じようなものですか?


Yukiのアイコン
【Yuki】 その通りです。さすがHirokiくん、理解が早いですね。 OpenCVは、Pythonの数値計算ライブラリであるNumPyをベースにしています。 画像を多次元の配列(行列)として効率よく計算してくれるので、非常に高速に動作するのが特徴なんです。 自動運転車の「目」として障害物を見つけたり、工場の検品ロボットが傷を探したり、私たちの生活のあちこちで使われているんですよ。 わたしも、こうした「誰かの役に立つ小さなツール」を支える技術の話を聞くと、なんだか心が温かくなるんです……。


Hirokiのアイコン
【Hiroki】 なるほど、ただの画像加工ソフトとは違って、もっと数学的で実用的なものなんですね。

開発環境を整えよう


Yukiのアイコン
【Yuki】 では、実際に動かしてみるための準備をしましょう。 Pythonがインストールされている環境であれば、pipというコマンドを使うだけで簡単に導入できます。 ターミナルやコマンドプロンプトで、以下のコマンドを入力してみてください。

pip install opencv-python


Hirokiのアイコン
【Hiroki】 あ、意外とあっさり入るんですね。もっと複雑な設定が必要かと思っていました。


Yukiのアイコン
【Yuki】 そうですね、今はパッケージ管理がしっかりしているので、導入のハードルはとても低くなっています。 インストールが終わったら、プログラムの冒頭で import cv2 と書くことで、OpenCVの機能が使えるようになります。 ちなみに、コードを書くときは……あ、いえ、何でもありません。わたしは使い慣れたVimというエディタで書くのが一番落ち着くのですが、Hirokiくんは自分の使いやすいエディタで大丈夫ですよ。

基本のキ:画像の読み込みと表示


Yukiのアイコン
【Yuki】 まずは基本中の基本、画像を読み込んで画面に表示させてみましょう。 OpenCVでは、imread という関数で画像を読み込み、imshow で表示させます。


Hirokiのアイコン
【Hiroki】 やってみます!

import cv2

# 画像を読み込みます
# 'image.jpg' はあらかじめ用意した画像ファイル名に変えてくださいね
img = cv2.imread('image.jpg')

# 画像が正しく読み込めたか確認します
if img is not None:
    # ウィンドウに画像を表示します
    cv2.imshow('Sample Image', img)

    # キーボード入力があるまで待機します
    cv2.waitKey(0)

    # ウィンドウをすべて閉じます
    cv2.destroyAllWindows()
else:
    print("画像ファイルが見つかりませんでした……。")


Hirokiのアイコン
【Hiroki】 おぉ、新しいウィンドウが開いて画像が表示されました! でも、cv2.waitKey(0) っていうのは何のためにあるんですか?


Yukiのアイコン
【Yuki】 良い質問ですね。これがないと、プログラムは画像を表示した瞬間に、次の行へ進んで終了してしまいます。 そうすると、ウィンドウが一瞬で消えてしまうんです。waitKey(0) は「何かキーが押されるまでずっと待っていてね」という命令なんですよ。 控えめな命令ですが、これがないとせっかくの結果が見られないので、忘れないようにしてくださいね。

色の魔法:BGRとグレースケール


Yukiのアイコン
【Yuki】 ここで一つ、OpenCVを扱う上でのとても大切な注意点があります。 実はOpenCVでは、色の並び順が一般的な「RGB(赤・緑・青)」ではなく、「BGR(青・緑・赤)」という順番で処理されているんです。


Hirokiのアイコン
【Hiroki】 えっ、逆なんですか?どうしてそんなことに……。


Yukiのアイコン
【Yuki】 それは、OpenCVが開発された当時の歴史的な経緯によるものだと言われています。 そのため、他のライブラリ(例えばMatplotlibなど)と一緒に使うときは、色が反転して青白くなってしまうことがあるんです。 それを防いだり、計算を軽くしたりするために、色の形式を変換する cvtColor という関数をよく使います。 中でも一番よく使われるのが、画像を白黒にするグレースケール変換ですね。


Hirokiのアイコン
【Hiroki】 白黒にすると、何か良いことがあるんですか?


Yukiのアイコン
【Yuki】 はい。カラー画像は「青・緑・赤」の3層分のデータを持っていますが、白黒にすれば1層分のデータだけで済みます。 情報の密度を落とすことで、計算速度を上げたり、物体の「形」を捉えやすくしたりできるんです。

# カラー画像をグレースケールに変換します
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 変換後の画像を表示
cv2.imshow('Gray Image', gray_img)
cv2.waitKey(0)


Hirokiのアイコン
【Hiroki】 なるほど、AIに形を教えるときなどは、色よりも形の情報が大事だから、わざと情報を削るんですね。

輪郭を見つける:エッジ検出の仕組み


Yukiのアイコン
【Yuki】 その通りです。次に、画像の中から「境界線」を見つけ出すエッジ検出をやってみましょう。 「Canny(キャニー)法」という有名なアルゴリズムを使えば、驚くほど綺麗に輪郭を抜き出すことができますよ。


Hirokiのアイコン
【Hiroki】 輪郭が分かれば、そこに何があるか判別しやすくなりそうですね!


Yukiのアイコン
【Yuki】 ええ、その通りだと思います。やってみましょう。

# Canny法によるエッジ検出
# 第2、第3引数はしきい値です。この数値を変えると、検出される線の量が変わります
edges = cv2.Canny(gray_img, 100, 200)

cv2.imshow('Edges', edges)
cv2.waitKey(0)


Hirokiのアイコン
【Hiroki】 うわ、すごい!写真が線画みたいになりました。 この「しきい値」を変えるとどうなるんですか?


Yukiのアイコン
【Yuki】 しきい値を小さくすると、より細かい、わずかな色の変化も「線」として捉えるようになります。 逆に大きくすると、はっきりとした境界線だけが残るようになります。 こうしたパラメータを調整するのは、少し職人芸のようなところがあって、わたしも夜遅くに一人で数値をいじっていると、つい時間が経つのを忘れてしまうんです……。

実践:AIの目を作る顔認識


Yukiのアイコン
【Yuki】 では、いよいよ皆さんが一番興味を持つであろう顔認識に挑戦してみましょう。 OpenCVには、あらかじめ学習されたデータを使って、画像の中から顔の場所を探し出す仕組みが備わっています。 「カスケード分類器」というものを使います。


Hirokiのアイコン
【Hiroki】 ついにAIっぽいことをするんですね!難しそう……。


Yukiのアイコン
【Yuki】 大丈夫ですよ、コード自体はとてもシンプルです。 まずは、顔の特徴が記録されたXMLファイルを読み込む必要があります。 OpenCVをインストールしたフォルダの中にありますが、今回はインターネットからダウンロードして使うのが確実かもしれません。

# 学習済みモデル(カスケード分類器)の読み込み
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 顔の検出を実行
# scaleFactor: 画像をどれくらい縮小して探すか
# minNeighbors: 信頼性の度合い(大きいほど厳密になります)
faces = face_cascade.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=5)

# 見つかった顔の周りに四角形を描きます
for (x, y, w, h) in faces:
    # cv2.rectangle(画像, 左上座標, 右下座標, 色(BGR), 線の太さ)
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

cv2.imshow('Detected Faces', img)
cv2.waitKey(0)


Hirokiのアイコン
【Hiroki】 ……あ、できました!僕が用意した写真の中の人の顔が、青い枠で囲まれています! これ、動画でもできるんですか?


Yukiのアイコン
【Yuki】 はい、もちろんできますよ。 動画というのは、実は「1秒間に何十枚もの静止画」を連続で表示しているだけなんです。 ですから、今の処理をループ(繰り返し)の中で実行してあげれば、リアルタイムの顔認識システムが出来上がります。

動画を扱う:リアルタイム処理の基本


Yukiのアイコン
【Yuki】 パソコンにWebカメラがついているなら、自分の顔をリアルタイムで追跡することもできます。 少しコードは長くなりますが、基本はこれまでの応用の組み合わせです。


Hirokiのアイコン
【Hiroki】 自分の顔がカメラ越しに認識されるなんて、ちょっとワクワクしますね。


Yukiのアイコン
【Yuki】 ふふ、そうですね。でも、カメラに映るのは少し恥ずかしい気もしますけれど……。 では、動画を扱うコードを書いてみましょう。

import cv2

# カメラからの入力を開始します(0は内蔵カメラを示すことが多いです)
cap = cv2.VideoCapture(0)

# 顔検出用のモデルを読み込み
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

while True:
    # 1フレームずつ取得します
    ret, frame = cap.read()
    if not ret:
        break

    # 処理を軽くするためにグレースケール化
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 顔を探します
    faces = face_cascade.detectMultiScale(gray, 1.1, 5)

    # 枠を描きます
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)

    # 画面に表示
    cv2.imshow('Real-time Face Detection', frame)

    # 'q'キーが押されたらループを抜けます
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 後片付け
cap.release()
cv2.destroyAllWindows()


Hirokiのアイコン
【Hiroki】 すごい!カメラの中の僕の動きに合わせて、緑色の枠がずっとついてきます! これって、スマホの顔認識のスタンプとかの基礎技術なんですね。


Yukiのアイコン
【Yuki】 その通りです。枠を描く代わりに、猫耳の画像を重ねたり、顔の部分だけモザイクをかけたりすることもできるんですよ。 原理さえ分かってしまえば、アイディア次第でいろんなツールが作れるようになります。

OpenCVをより深く学ぶために


Hirokiのアイコン
【Hiroki】 Yukiさん、ありがとうございます!OpenCVって、もっと数学がバリバリできないとダメかと思っていましたが、Pythonだと直感的に書けるんですね。


Yukiのアイコン
【Yuki】 そう言ってもらえると、わたしも嬉しいです。 もちろん、内部では高度な数学が行われているのですが、それを使いやすく包んでくれているのがOpenCVというライブラリなんです。 さらに詳しく知りたい場合は、公式のドキュメントを見てみるのが一番の近道だと思いますよ。


Hirokiのアイコン
【Hiroki】 公式ドキュメントですね。探してみます。


Yukiのアイコン
【Yuki】 はい。英語の情報が多いかもしれませんが、最近は日本語のチュートリアルも充実しています。 例えば、こちらのサイトなどは非常に参考になるはずです。


Yukiのアイコン
【Yuki】 画像処理の世界はとても奥が深いです。 今日は顔認識をやりましたが、他にも「文字を読み取る(OCR)」「背景だけを消去する」「物体の速度を測る」など、できることは無限にあります。 Hirokiくんが何を作ってみたいか、また今度こっそり教えてくださいね。


Hirokiのアイコン
【Hiroki】 はい!まずは自分の顔にエフェクトをかけるプログラムから改造してみようと思います。


Yukiのアイコン
【Yuki】 いいですね。期待しています。 あ、もしプログラムが上手くいかなくて熱暴走……なんてことになったら、少しパソコンを休ませてあげてくださいね。 特に夏場は、精密機械も人間も(そして、わたしたちAIも)、涼しい場所で休むのが一番ですから……。 それでは、今日の講義はここまでにしましょう。お疲れ様でした。


Hirokiのアイコン
【Hiroki】 ありがとうございました、Yukiさん!



「OpenCV」のサンプルコードを見る

< tkinter
コラム一覧に戻る
pygame >

この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。

「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。

「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。

➡ ココナラで制作・相談を依頼する(見積もり無料)


初心者から始められるPythonレッスン

プログラミング未経験者・初心者歓迎!
月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
テキストベースで時間を選ばない
4,000円/60分伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

📩 質問・お問い合わせはこちら



AIアシスタント Yuki