アーパボー(ARPABLE)
アープらしいエンジニア、それを称賛する言葉・・・アーパボー(商標登録6601061)
画像処理系

OPENCVで簡単に画像処理を始めよう【初心者編】

OPENCVで簡単に画像処理を始めよう【初心者編】

この記事では、初心者でもわかりやすくOPENCVを利用した画像処理の始め方を解説します。画像処理に興味がある方やこれから学び始める方に向けて、基本的な操作方法と具体的な応用例を紹介します。

OpenCV初心者向けガイド。画像処理の基本から応用まで、インストール方法や具体的なコード例を通じてわかりやすく解説。


OPENCVを始めよう

OPENCVとは何か

OPENCVは、画像処理やコンピュータビジョンのためのオープンソースライブラリです。多くの言語でサポートされており、初心者でも手軽に扱うことができます。
OPENCVは、画像認識、物体検出、顔認識、モーション検出など、幅広い画像処理タスクに使用されています。

インストール方法

Pythonを使用する場合、pipを使って簡単にOPENCVをインストールできます。コマンドは「pipinstallopencv-python」です。このコマンドを実行すると、OPENCVとその依存関係が自動的にインストールされます。

基本的な画像操作

OPENCVを使って画像を読み込み、表示、保存する基本的な操作を説明します。まず、
OPENCVライブラリをインポートします。
python
import cv2
次に、画像を読み込みます。
python img=cv2.imread(‘image.jpg’)
このコードは、’image.jpg’というファイルから画像を読み込み、img変数に格納します。画像を表示するには、以下のコードを使用します。
python cv2.imshow(‘Image’,img) cv2.waitKey(0) cv2.destroyAllWindows()
このコードは、’Image’というウィンドウに画像を表示します。waitKey(0)は、キーが押されるまでウィンドウを閉じないようにします。
destroyAllWindows()は、すべてのウィンドウを閉じます。画像を保存するには、以下のコードを使用します。
python cv2.imwrite(‘output.jpg’,img)
このコードは、img変数に格納されている画像を’output.jpg’というファイルに保存します。

基本テクニックで魅力体験

カラーフィルタリングの基礎

カラーフィルタリングは、特定の色領域を抽出する画像処理技術です。
OPENCVでは、inRange関数を使用して、入力画像から特定の色だけを取り出すことができます。
importcv2
import numpy as np
# 画像を読み込む
img = cv2.imread(‘image.jpg’)
#色の範囲を定義する
lower_blue = np.array([100, 50, 50])
upper_blue = np.array([130,255, 255])
# inRange関数を使用して、青い色だけを抽出する
mask = cv2.inRange(img, lower_blue,upper_blue)
# 元画像にマスクを適用する
result = cv2.bitwise_and(img, img,mask=mask)
# 結果を表示する
cv2.imshow(‘Original’, img)
cv2.imshow(‘Mask’,mask)
cv2.imshow(‘Result’,result)
cv2.waitKey(0) cv2.destroyAllWindows()
このコードでは、まず、画像を読み込み、青い色の範囲を定義します。次に、inRange関数を使用して、青い色だけを抽出します。最後に、元画像にマスクを適用して、青い色だけを表示します。

画像変換と応用

OPENCVで画像処理をかけている画像変換は、画像のサイズを変更したり、回転したり、グレースケールに変換したりするなど、画像を操作するための基本的な技術です。
OPENCVでは、これらの変換を簡単に実行できます。
python
importcv2
# 画像を読み込む
img = cv2.imread(‘image.jpg’)
# 画像を回転する
rows, cols =img.shape[:2]
center = (cols / 2, rows / 2)
angle = 45
scale =1
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated_img= cv2.warpAffine(img, rotation_matrix, (cols, rows))
# 画像をリサイズする
resized_img= cv2.resize(img, (300, 200))
# 画像をグレースケールに変換する
gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 結果を表示する
cv2.imshow(‘Original’,img)
cv2.imshow(‘Rotated’, rotated_img)
cv2.imshow(‘Resized’,resized_img)
cv2.imshow(‘Gray’,gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
このコードでは、画像を回転、リサイズ、グレースケール変換する方法を示しています。getRotationMatrix2D関数を使用して回転行列を作成し、warpAffine関数を使用して画像を回転します。resize関数を使用して画像のサイズを変更し、cvtColor関数を使用して画像をグレースケールに変換します。

リアルタイム映像処理

リアルタイム映像処理OPENCVを使ってウェブカメラを接続してリアルタイムで映像を処理する方法を説明します。
python
importcv2
# ウェブカメラを開く
cap = cv2.VideoCapture(0) while(True):
# フレームを取得する
ret, frame = cap.read()
# フレームを反転する
frame = cv2.flip(frame, 1)
#フレームを表示する
cv2.imshow(‘Webcam’, frame)
# ‘q’キーが押されたらループを終了する
ifcv2.waitKey(1) & 0xFF == ord(‘q’): break
#カメラを解放する cap.release() cv2.destroyAllWindows()
このコードでは、まず、VideoCapture関数を使用してウェブカメラを開きます。次に、whileループでフレームを取得し、フレームを反転して表示します。waitKey(1)は、1ミリ秒間キーが押されるのを待ちます。’q’キーが押されたらループを終了し、カメラを解放します。

実用的なOPENCVの使用例

顔認識するアプリの作成

顔認識するアプリの作成

OPENCVを使って簡単な顔認識アプリを作成する方法を紹介します。
事前に学習されたカスケード分類器を利用します。
python
importcv2
# カスケード分類器を読み込む
face_cascade =cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
# ウェブカメラを開く
cap= cv2.VideoCapture(0) while(True):
# フレームを取得する
ret, frame =cap.read()
# グレースケールに変換する
gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
# 顔を検出する
faces = face_cascade.detectMultiScale(gray,1.1, 4)
# 顔を囲む矩形を描画する
for (x, y, w, h) in faces:
 cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
# フレームを表示する
cv2.imshow(‘FaceDetection’, frame)
# ‘q’キーが押されたらループを終了する
if cv2.waitKey(1) & 0xFF == ord(‘q’):
 break
# カメラを解放する
cap.release()
cv2.destroyAllWindows()
このコードでは、まず、カスケード分類器を読み込みます。次に、ウェブカメラを開き、フレームを取得してグレースケールに変換します。detectMultiScale関数を使用して顔検出を行い、検出された顔に矩形を描画します。

モーションディテクションの活用

動体検知は、セキュリティシステムや監視システムなど、さまざまな用途に使用されています。OPENCVを使って簡単な動体検知システムを作成する方法を紹介します。
python
importcv2
# ウェブカメラを開く
cap = cv2.VideoCapture(0)
# 最初のフレームを取得する
ret, first_frame = cap.read() 
first_frame = cv2.cvtColor(first_frame,cv2.COLOR_BGR2GRAY) 
first_frame = cv2.GaussianBlur(first_frame, (5, 5),0)
while(True):
 # フレームを取得する
 ret, frame = cap.read()
 # グレースケールに変換する
 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)   
 # ガウシアンブラーをかける
 gray =cv2.GaussianBlur(gray, (5, 5), 0)   
 # 差分を計算する
 diff =cv2.absdiff(first_frame, gray)
 # しきい値処理を行う
 thresh = cv2.threshold(diff,30, 255, cv2.THRESH_BINARY)
 # 輪郭を検出する
 contours, hierarchy =cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
 #輪郭を描画する
 for contour in contours:
  if cv2.contourArea(contour) < 1000:
   continue
   (x, y, w, h) = cv2.boundingRect(contour)
   cv2.rectangle(frame, (x,y), (x + w, y + h), (0, 255, 0), 2)
  # フレームを表示する  
  cv2.imshow(‘MotionDetection’, frame)
  # ‘q’キーが押されたらループを終了する
  if cv2.waitKey(1) & 0xFF ==ord(‘q’): break
#カメラを解放する
cap.release() cv2.destroyAllWindows()
このコードでは、まず、最初のフレームを取得してグレースケールに変換し、ガウシアンブラーをかけます。次に、whileループでフレームを取得し、グレースケールに変換してガウシアンブラーをかけます。最初のフレームとの差分を計算し、しきい値処理を行います。最後に、輪郭を検出し、検出された輪郭に矩形を描画します。

画像補正の技術

ノイズ除去やシャープ化技術を用いて画像をより鮮明にする方法を解説します。
python
import cv2
# 画像を読み込む
img = cv2.imread(‘image.jpg’)
# ノイズ除去
denoised_img =cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
#シャープ化 sharpened_img = cv2.filter2D(img, -1,np.array([[-1,-1,-1],[-1,9,-1],[-1,-1,-1]]))
#結果を表示する
cv2.imshow(‘Original’, img)
cv2.imshow(‘Denoised’,denoised_img)
cv2.imshow(‘Sharpened’,sharpened_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
このコードでは、fastNlMeansDenoisingColored関数を使用してノイズ除去を行い、filter2D関数を使用してシャープ化を行います。

まとめ

OPENCVは初心者でも簡単に扱える強力なツールセットを提供しています。
この記事を通して、基本的な操作から応用技術までを学び、OPENCVの可能性を体験していただければ幸いです。
OPENCVは、画像処理やコンピュータビジョンの分野で幅広く活用されています。ぜひ、OPENCVを使って、画像処理の世界を探検してみてください。

以上

筆者 プロフィール 
ケニー狩野( 中小企業診断士、PMP、ITコーディネータ)
キヤノン(株)でアーキテクト、プロマネとして多数のプロジェクトをリード。
現在、株式会社ベーネテック代表、株式会社アープ取締役、Society 5.0振興協会評議員ブロックチェーン導入評価委員長。
これまでの知見を活かしブロックチェーンや人工知能技術の推進に従事。趣味はダイビングと囲碁。2018年「リアル・イノベーション・マインド」を出版。