🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

5009閲覧

フォルダ内の画像全てに一括で処理を行う

ZEKE

総合スコア6

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/18 04:52

**Python及びOpenCVを使用して

ある特定の画像フォルダ内の画像に対して円の重心を調べ結果を報告するプログラムを作りたいのですが。動きません。**

2つ作ったのですが。
どちらも動きません。

作ったプログラム

1つ目
/////////////////////////////////////////
import glob
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

/// 設定
img_dir = '' # 入力ディレクトリ
out_dir = '' # 出力ディレクトリ

// 指定したフォルダの画像ファイルの一覧を取得する。
types = [ '*.jpg']
paths = []
for t in types:
paths.extend(glob.glob(os.path.join(img_dir, t)))

os.makedirs(out_dir, exist_ok=True)
for p in paths:
img = Image.open(p) # 読み込む。

//以下各画像に対する処理を記載する

mu = cv2.moments(img, False)
x,y= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"])

cv2.circle(img, (x,y), 4, 100, 2, 4)
plt.imshow(img)
plt.colorbar()
plt.show()

print(x,y)

///////////////////////////////////////////////////

2つ目
//////////////////////////////////////////////////

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

def main():
data_dir_path = u"./画像ディレクトリ名/"
file_list = os.listdir(r'./画像ディレクトリ名/')

for file_name in file_list: root, ext = os.path.splitext(file_name) if ext == u'.png' or u'.jpeg' or u'.jpg': abs_name = data_dir_path + '/' + file_name image = cv.imread(abs_name)

//以下各画像に対する処理を記載する
mu = cv2.moments(img, False)
x,y= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"])

cv2.circle(img, (x,y), 4, 100, 2, 4)
plt.imshow(img)
plt.colorbar()
plt.show()

print(x,y)

if name == 'main':
main()

///////////////////////////////////////////////////////

2つ目のエラー

NameError: name 'img' is not defined
各画像に対する処理に入れる部分をフォルダ名にすればいいんですかね?

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

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

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

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

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

guest

回答2

0

グレースケール変換をこのように記述するのはどうでしょうか?

img = cv2.imread(abs_name)

のあとに

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

これでグレースケール化したimgができるかと思います

投稿2019/12/18 07:45

TinyTech

総合スコア107

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

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

0

Python

1image = cv.imread(abs_name)

でimageとしているものを,後ろではimgとして使っているため
宣言されていないとなっています.

Python

1img = cv.imread(abs_name)

にしてみたら動くかもしれません.

投稿2019/12/18 05:47

aqufiz

総合スコア70

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

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

ZEKE

2019/12/18 06:04

返信ありがとうございます。 変えてみたところ下のようなエラーが出てしまいました。 mu = cv2.moments(img, False) NameError: name 'img' is not defined
aqufiz

2019/12/18 06:45

あと,cv2.imreadの2が抜けてしまっていますね
aqufiz

2019/12/18 06:50

moments関数はグレースケールの画像をもとにモーメントを計算するのでimreadで画像を読み込むときに、IMREAD_GRAYSCALE オプションをつけなくてはいけないので, img = cv2.imread(abs_name,cv2.IMREAD_GRAYSCALE) に変更すればうまくいくと思います.
ZEKE

2019/12/18 07:14

変えてみたんですが、 モジュールが見つからないって言われます。 <module> mu = cv2.moments(img, False) NameError: name 'img' is not defined 作成しなおしたプログラム import os import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image def main(): data_dir_path = u"./Tobi_ghost_one_second/" file_list = os.listdir(r'./Tobi_ghost_one_second/') for file_name in file_list: root, ext = os.path.splitext(file_name) if ext == u'.png' or u'.jpeg' or u'.jpg': abs_name = data_dir_path + '/' + file_name img = cv2.imread(abs_name,cv2.IMREAD_GRAYSCALE) #以下各画像に対する処理を記載する mu = cv2.moments(img, False) x,y= int(mu["m10"]/mu["m00"]) , int(mu["m01"]/mu["m00"]) cv2.circle(img, (x,y), 4, 100, 2, 4) plt.imshow(img) plt.colorbar() plt.show() print(x,y) if __name__ == '__main__': main()
aqufiz

2019/12/18 07:40

関数の宣言とif文の後ってインデントされてますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問