全身画像の写真を使用して上半身、下半身に2つの領域で分けるということがしたいです。
ネットで調べていろいろなのを試しているのですがエラーばかりで苦戦しています。
詳しく教えていただけたらありがたいです。
発生している問題・エラーメッセージ
error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
該当のソースコード
import cv2 import numpy as np # 指定した画像(path)の物体を検出し、外接矩形の画像を出力します def detect_contour(path): # 画像を読込 src = cv2.imread("image2.jpg", cv2.IMREAD_COLOR) # グレースケール画像へ変換 gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) # 2値化 retval, bw = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) # 輪郭を抽出 # contours : [領域][Point No][0][x=0, y=1] # cv2.CHAIN_APPROX_NONE: 中間点も保持する # cv2.CHAIN_APPROX_SIMPLE: 中間点は保持しない contours, hierarchy = cv2.findContours(bw, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 矩形検出された数(デフォルトで0を指定) detect_count = 0 # 各輪郭に対する処理 for i in range(0, len(contours)): # 輪郭の領域を計算 area = cv2.contourArea(contours[i]) # ノイズ(小さすぎる領域)と全体の輪郭(大きすぎる領域)を除外 if area < 1e2 or 1e5 < area: continue # 外接矩形 if len(contours[i]) > 0: rect = contours[i] x, y, w, h = cv2.boundingRect(rect) cv2.rectangle(src, (x, y), (x + w, y + h), (0, 255, 0), 2) # 外接矩形毎に画像を保存 cv2.imwrite('{"C:\Users\Documents}' + str(detect_count) + '.jpg', src[y:y + h, x:x + w]) detect_count = detect_count + 1 # 外接矩形された画像を表示 cv2.imshow('output', src) cv2.waitKey(0) # 終了処理 cv2.destroyAllWindows() if __name__ == '__main__': detect_contour('{"C:\Users\Documents}/{image}.jpg')
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
numpyというのはインストールできていないです。
import os
print(os.path.abspath("image2.jpg"))
で相対パスが指している絶対パスを確認できるので、そこにファイルがあるかどうかチェックしてください
確認したところファイルはありました。
エラーが出ているのが cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) の行だとしたら、ファイルの読み込みに失敗していますよ。
print(src) とすると None となっていると思います。
os モジュールでファイルが存在するかどうか確認できますので、以下が True になるかどうかチェックしてください。
print(os.path.exists("image2.jpg"))
もしこれが False になったら、ファイルが存在していないことになります。
print(src)を入力したら数字がたくさん出てきました。
print(os.path.exists("image2.jpg"))はTrueでした。
だとしたら、ファイルが読み込めています。
そうであれば、gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) でエラーが出るはずがないのですが、エラーが発生しているのはその行であっていますか?
def detect_contour("C:\Users\Documents"):
^
SyntaxError: invalid syntax
こんな感じでエラーが出てしまいます。
ご質問のコードから書き換わってますか?
コードを修正したら、再度貼り付けてください。
ファイルがあるかどうかの確認をしただけなのでコードは変わってないです。
def detect_contour(path):がdef detect_contour("C:\Users\Documents"):に書き換わっていますが...元に戻さないのですか?
戻します。すいません。
エラーは解決しましたか?
解決しました。ありがとうございます。
追加の質問も書かせていただいたんでもし分かるようでしたらよろしくお願いします。
でしたら、一度この質問は解決済みとし、追加の質問に関しては別に質問を立てられたほうが回答がつきやすいと思います。gdgd_tink様が原因と解決策を回答に書いて、ご自分の回答をベストアンサーとしてください。ご面倒だとは思いますがよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー