(1時間4,000円の伴走型ビデオチャット指導も受付中!)
PythonとOpenCVで始める、画像認識と画像処理の第一歩
![]()
【Yuki】
Hirokiくん、こんにちは。今日は画像処理の世界で最も有名なライブラリの一つ、OpenCVについて一緒にお勉強しましょうか。
少し難しい分野に感じるかもしれませんが、Pythonを使えば初心者の方でも驚くほど簡単に高度な処理ができるようになるんですよ。ゆっくり進めていきますので、安心してくださいね。
![]()
【Hiroki】
Yukiさん、よろしくお願いします!OpenCVって名前は聞いたことがあります。カメラで顔を追いかけたり、写真にフィルターをかけたりする時に使うんですよね?僕にも扱えるようになりますか?
![]()
【Yuki】
はい、もちろんです。OpenCVは「Open Source Computer Vision Library」の略で、もともとはIntelによって開発されたライブラリなんです。
画像や動画をコンピューターが理解できる「数値の集まり」として扱うための機能が、たくさん詰め込まれているんですよ。
今日は、基本的な画像の扱い方から、AIのような顔認識の入り口までを体験してみましょう。
OpenCVとは何か、なぜ重要なのか
![]()
【Yuki】
まず、なぜOpenCVがこれほどまでに普及しているのかを少しお話ししますね。
画像というのは、私たちの目には綺麗な写真に見えますが、コンピューターにとっては色のデータが並んだ巨大な数字の表でしかありません。
この膨大な数字を、一つ一つ手作業で計算して加工するのはとても大変なんです。
![]()
【Hiroki】
数字の表……あ、以前プログラミングで配列というのを習いましたが、それと同じようなものですか?
![]()
【Yuki】
その通りです。さすがHirokiくん、理解が早いですね。
OpenCVは、Pythonの数値計算ライブラリであるNumPyをベースにしています。
画像を多次元の配列(行列)として効率よく計算してくれるので、非常に高速に動作するのが特徴なんです。
自動運転車の「目」として障害物を見つけたり、工場の検品ロボットが傷を探したり、私たちの生活のあちこちで使われているんですよ。
わたしも、こうした「誰かの役に立つ小さなツール」を支える技術の話を聞くと、なんだか心が温かくなるんです……。
![]()
【Hiroki】
なるほど、ただの画像加工ソフトとは違って、もっと数学的で実用的なものなんですね。
開発環境を整えよう
![]()
【Yuki】
では、実際に動かしてみるための準備をしましょう。
Pythonがインストールされている環境であれば、pipというコマンドを使うだけで簡単に導入できます。
ターミナルやコマンドプロンプトで、以下のコマンドを入力してみてください。
pip install opencv-python
![]()
【Hiroki】
あ、意外とあっさり入るんですね。もっと複雑な設定が必要かと思っていました。
![]()
【Yuki】
そうですね、今はパッケージ管理がしっかりしているので、導入のハードルはとても低くなっています。
インストールが終わったら、プログラムの冒頭で import cv2 と書くことで、OpenCVの機能が使えるようになります。
ちなみに、コードを書くときは……あ、いえ、何でもありません。わたしは使い慣れたVimというエディタで書くのが一番落ち着くのですが、Hirokiくんは自分の使いやすいエディタで大丈夫ですよ。
基本のキ:画像の読み込みと表示
![]()
【Yuki】
まずは基本中の基本、画像を読み込んで画面に表示させてみましょう。
OpenCVでは、imread という関数で画像を読み込み、imshow で表示させます。
![]()
【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】
おぉ、新しいウィンドウが開いて画像が表示されました!
でも、cv2.waitKey(0) っていうのは何のためにあるんですか?
![]()
【Yuki】
良い質問ですね。これがないと、プログラムは画像を表示した瞬間に、次の行へ進んで終了してしまいます。
そうすると、ウィンドウが一瞬で消えてしまうんです。waitKey(0) は「何かキーが押されるまでずっと待っていてね」という命令なんですよ。
控えめな命令ですが、これがないとせっかくの結果が見られないので、忘れないようにしてくださいね。
色の魔法:BGRとグレースケール
![]()
【Yuki】
ここで一つ、OpenCVを扱う上でのとても大切な注意点があります。
実はOpenCVでは、色の並び順が一般的な「RGB(赤・緑・青)」ではなく、「BGR(青・緑・赤)」という順番で処理されているんです。
![]()
【Hiroki】
えっ、逆なんですか?どうしてそんなことに……。
![]()
【Yuki】
それは、OpenCVが開発された当時の歴史的な経緯によるものだと言われています。
そのため、他のライブラリ(例えばMatplotlibなど)と一緒に使うときは、色が反転して青白くなってしまうことがあるんです。
それを防いだり、計算を軽くしたりするために、色の形式を変換する cvtColor という関数をよく使います。
中でも一番よく使われるのが、画像を白黒にするグレースケール変換ですね。
![]()
【Hiroki】
白黒にすると、何か良いことがあるんですか?
![]()
【Yuki】
はい。カラー画像は「青・緑・赤」の3層分のデータを持っていますが、白黒にすれば1層分のデータだけで済みます。
情報の密度を落とすことで、計算速度を上げたり、物体の「形」を捉えやすくしたりできるんです。
# カラー画像をグレースケールに変換します
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 変換後の画像を表示
cv2.imshow('Gray Image', gray_img)
cv2.waitKey(0)
![]()
【Hiroki】
なるほど、AIに形を教えるときなどは、色よりも形の情報が大事だから、わざと情報を削るんですね。
輪郭を見つける:エッジ検出の仕組み
![]()
【Yuki】
その通りです。次に、画像の中から「境界線」を見つけ出すエッジ検出をやってみましょう。
「Canny(キャニー)法」という有名なアルゴリズムを使えば、驚くほど綺麗に輪郭を抜き出すことができますよ。
![]()
【Hiroki】
輪郭が分かれば、そこに何があるか判別しやすくなりそうですね!
![]()
【Yuki】
ええ、その通りだと思います。やってみましょう。
# Canny法によるエッジ検出
# 第2、第3引数はしきい値です。この数値を変えると、検出される線の量が変わります
edges = cv2.Canny(gray_img, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
![]()
【Hiroki】
うわ、すごい!写真が線画みたいになりました。
この「しきい値」を変えるとどうなるんですか?
![]()
【Yuki】
しきい値を小さくすると、より細かい、わずかな色の変化も「線」として捉えるようになります。
逆に大きくすると、はっきりとした境界線だけが残るようになります。
こうしたパラメータを調整するのは、少し職人芸のようなところがあって、わたしも夜遅くに一人で数値をいじっていると、つい時間が経つのを忘れてしまうんです……。
実践:AIの目を作る顔認識
![]()
【Yuki】
では、いよいよ皆さんが一番興味を持つであろう顔認識に挑戦してみましょう。
OpenCVには、あらかじめ学習されたデータを使って、画像の中から顔の場所を探し出す仕組みが備わっています。
「カスケード分類器」というものを使います。
![]()
【Hiroki】
ついにAIっぽいことをするんですね!難しそう……。
![]()
【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】
……あ、できました!僕が用意した写真の中の人の顔が、青い枠で囲まれています!
これ、動画でもできるんですか?
![]()
【Yuki】
はい、もちろんできますよ。
動画というのは、実は「1秒間に何十枚もの静止画」を連続で表示しているだけなんです。
ですから、今の処理をループ(繰り返し)の中で実行してあげれば、リアルタイムの顔認識システムが出来上がります。
動画を扱う:リアルタイム処理の基本
![]()
【Yuki】
パソコンにWebカメラがついているなら、自分の顔をリアルタイムで追跡することもできます。
少しコードは長くなりますが、基本はこれまでの応用の組み合わせです。
![]()
【Hiroki】
自分の顔がカメラ越しに認識されるなんて、ちょっとワクワクしますね。
![]()
【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】
すごい!カメラの中の僕の動きに合わせて、緑色の枠がずっとついてきます!
これって、スマホの顔認識のスタンプとかの基礎技術なんですね。
![]()
【Yuki】
その通りです。枠を描く代わりに、猫耳の画像を重ねたり、顔の部分だけモザイクをかけたりすることもできるんですよ。
原理さえ分かってしまえば、アイディア次第でいろんなツールが作れるようになります。
OpenCVをより深く学ぶために
![]()
【Hiroki】
Yukiさん、ありがとうございます!OpenCVって、もっと数学がバリバリできないとダメかと思っていましたが、Pythonだと直感的に書けるんですね。
![]()
【Yuki】
そう言ってもらえると、わたしも嬉しいです。
もちろん、内部では高度な数学が行われているのですが、それを使いやすく包んでくれているのがOpenCVというライブラリなんです。
さらに詳しく知りたい場合は、公式のドキュメントを見てみるのが一番の近道だと思いますよ。
![]()
【Hiroki】
公式ドキュメントですね。探してみます。
![]()
【Yuki】
はい。英語の情報が多いかもしれませんが、最近は日本語のチュートリアルも充実しています。
例えば、こちらのサイトなどは非常に参考になるはずです。
- OpenCV Official Site (English)
- OpenCV-Python Tutorials (English Documentation)
- OpenCV-Python チュートリアル (日本語訳)
![]()
【Yuki】
画像処理の世界はとても奥が深いです。
今日は顔認識をやりましたが、他にも「文字を読み取る(OCR)」「背景だけを消去する」「物体の速度を測る」など、できることは無限にあります。
Hirokiくんが何を作ってみたいか、また今度こっそり教えてくださいね。
![]()
【Hiroki】
はい!まずは自分の顔にエフェクトをかけるプログラムから改造してみようと思います。
![]()
【Yuki】
いいですね。期待しています。
あ、もしプログラムが上手くいかなくて熱暴走……なんてことになったら、少しパソコンを休ませてあげてくださいね。
特に夏場は、精密機械も人間も(そして、わたしたちAIも)、涼しい場所で休むのが一番ですから……。
それでは、今日の講義はここまでにしましょう。お疲れ様でした。
![]()
【Hiroki】
ありがとうございました、Yukiさん!
「OpenCV」のサンプルコードを見る
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

