質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1476閲覧

Pythonとopencvを用いて画像から特定の色を持つ領域の個数を解析するプログラム

azumanet

総合スコア12

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/06/17 15:06

前提・実現したいこと

Pythonとopencvを用いて画像から特定の色を持つ領域の個数を解析するプログラムを作っています。
現在いくつかのサイト様のサンプルコードをつぎはぎしながら作っています。

自分の力では、コード一行一行を読み解き構造を理解するの難しいため質問させて頂きました。

どうかお力添えのほどよろしくお願いします。

発生している問題・エラーメッセージ

ValueError: not enough values to unpack (expected 3, got 2)

該当のソースコード

Python

1#!/usr/bin/python 2# -*- coding: shift_jis -*- 3 4import os, tkinter, tkinter.filedialog, tkinter.messagebox 5import cv2 6import matplotlib.pyplot as plt 7import numpy as np 8from matplotlib.patches import Polygon 9 10#画像を読み込む 11#################################################### 12root = tkinter.Tk() 13root.withdraw() 14 15# 選択候補を拡張子jpgに絞る(絞らない場合は *.jpg → *) 16filetype = [("", "*.jpg")] 17 18dirpath = os.path.abspath(os.path.dirname(__file__)) 19tkinter.messagebox.showinfo('テスト', 'ファイルを選択してください') 20 21# 選択したファイルのパスを取得 22filepath = tkinter.filedialog.askopenfilename(filetypes = filetype, initialdir = dirpath) 23 24 25# 選択したファイル名を表示 26tkinter.messagebox.showinfo('テスト', filepath) 27 28# image info 29image_file = 'filepath' 30img = cv2.imread(filepath) 31#################################################### 32 33# 色基準で2値化する。 34hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSV 色空間に変換 35 36red = cv2.inRange(hsv, np.array([145, 70, 0]), np.array([180, 255, 255])) 37yellow = cv2.inRange(hsv, np.array([10, 80, 0]), np.array([50, 255, 255])) 38green = cv2.inRange(hsv, np.array([30, 190, 0]), np.array([90, 255, 255])) 39blue = cv2.inRange(hsv, np.array([90, 121, 0]), np.array([130, 255, 255])) 40white = cv2.inRange(hsv, np.array([108, 21, 0]), np.array([255, 70, 255])) 41 42 43# 白だけゴミがあるので、収縮演算 44kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) 45white = cv2.erode(white, kernel) 46 47 48bin_imgs = {'red': red, 'yellow': yellow, 'green': green, 49 'blue': blue, 'white': white} 50 51fig, ax = plt.subplots(figsize=(8, 5)) 52ax.axis('off') 53ax.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 54 55 56# 輪郭検出し、数を求める。 57############################################## 58 59for label, bin_img in bin_imgs.items():########################エラー部分 60 _, contours, _ = cv2.findContours(#########################エラー部分 61 bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)###エラー部分 62 # 輪郭を構成する頂点数で誤検出を除く。 63 contours = list(filter(lambda cnt: len(cnt) > 30, contours)) 64 count = len(contours) 65 66 print('color: {}, conunt: {}'.format(label, count)) 67 68 # 描画する。 69 for cnt in contours: 70 cnt = np.squeeze(cnt, axis=1) # (N, 1, 2) -> (N, 2) 71 ax.add_patch(Polygon(cnt, fill=None, lw=2., color=label)) 72plt.show() 73 74

参考にさせて頂いた先の質問

https://teratail.com/questions/149687

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

OpenCV 3 以前と OpenCV 4 では、findContours() の返り値の仕様が変わったのが原因。

OpenCV3

1image, contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

OpenCV4

1contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

なので、エラー箇所を以下のように直す。

python

1contours, _ = cv2.findContours(bin_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

投稿2019/06/17 15:18

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azumanet

2019/06/17 16:28

ありがとうございます! エラー文で検索しても何も出てこなかったのでものすごく助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問