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

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

詳細はこちら
Python

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

Q&A

解決済

1回答

681閲覧

グリッドをずらすプログラムを作成中なのですがうまく動作しません

nonnon615

総合スコア19

Python

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

0グッド

0クリップ

投稿2021/01/05 13:26

何度か質問をさせていただき,プログラムを作成しています.
しかし,うまく動作しないため,どのようにすればうまくいくかご教授ください.
エラーは起きませんがなにも結果がおこりません.
forループがおかしいと思います。
また,これでは保存がうまくいかないに気もしますが,いまいちわからず…
助けてください

import cv2 import pathlib import re import matplotlib.pyplot as plt import numpy as np import math round=lambda x:(x*2+1)//2 y_step=101 x_step=101 s=2.4 t=1/30 u=10 v=round(s*t*u) folder1_path = pathlib.Path("images1") output_path = pathlib.Path('images2') step_img_list = folder1_path.glob('*.jpg') for step_img_file in step_img_list: i=1 img = cv.imread(step_img_file) j=v*i k=x_step-j img_y,img_x=img.shape[:2] img[y_step:img_y:y_step, :, :] = 0 img[:, k:img_x:x_step, :] = 0 cv2.imwrite('grid_(\04d+).jpg',img) i=i+1

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

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

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

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

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

TakaiY

2021/01/05 13:44

何も起きないということですが、原因はいろいろ考えられます。 原因を探るために、デバッグしてみていますか? - VSCodeなどで書いているのであれば、そこからデバッグで1行ずつ実行しながら変数の内容を確認 - やりかたがわからなければ、いろいろな場所にprintを挿入して変数の値を表示 まずは、step_img_list の変数に想定どおりのファイルのリストが入っているかどうか確認してください。 あと、'cv2.imwrite('grid_(\04d+).jpg',img)' はたぶん想定通りのファイル名にはなりませんよ。 どのようなファイル名が生成されると思っていますか?
nonnon615

2021/01/05 13:48

コメントありがとうございます。 たぶん動いてはいるんですけど、仰られている通り保存する過程と、変数iのところのループが変な気がします。 画像を書き出して新規フォルダに保存する過程がいつも上手く行えません。もちろん調べているのですが、難しくて理解できていません。やり方を教えて頂きたいです。
TakaiY

2021/01/05 13:59

「いろいろな場所にprintを挿入して変数の値を表示」くらいはできますよね?
nonnon615

2021/01/05 14:03

できます。printで変数を全てチェックしようとしたのですが、表示すらされなかったのですがなぜでしょうか
TakaiY

2021/01/05 14:04

どこに入れましたか? まずは、 step_img_list = folder1_path.glob('*.jpg') の後に必要ですよ。
TakaiY

2021/01/05 14:05

print(list(step_img_list)) のようにリスト化しないと内容が表示されないかもしれません。
nonnon615

2021/01/05 14:06

その直後だとs,t,u,vの全ての変数はただしく表示されます。for以降なにも表示されないです
TakaiY

2021/01/05 14:10

ここで表示させたいのは、それらの変数ではなく、step_img_listの中身です。 ここに、対象のjpgファイルのリストが入っているはずですのでその確認をしなければなりません。 たぶん、何も入っていないと思います。
nonnon615

2021/01/05 14:16

<generator object Path.glob at 0x09D4AF70> と表記されました
TakaiY

2021/01/05 14:18

ですよね。なので、前に書いたとおり、 print(list(step_img_list)) としてください。
nonnon615

2021/01/05 14:20

適当に作ったフォルダなので中身も適当ですが [WindowsPath('images1/0001.jpg'), WindowsPath('images1/0002.jpg')] と表記され,画像が2つ入っていることが確認できました
TakaiY

2021/01/05 14:21

ちなみにgeneratorというのは、for文などで呼ばれると中身を1つずつ出してくれるオブジェクトです。 中を見るためには全部出してやらなくてはならないのですが、その1つがリスト化です。
TakaiY

2021/01/05 14:25

ということは、ファイルは取得できているはずなので、for文が1回も回らないということはなさそうですね。 では次はfor文の中を見ていくことになりますが、for文の直後にstep_img_file の値をprintするとどうなるでしょう
TakaiY

2021/01/05 14:34

ああ、エラーでているんですね。 もしかして、ずっとこのエラー出ていませんか? Traceback から始まる表示は、処理中に問題がおきてプログラムが異常終了したことを示しています。 cv2がこのイメージ(0001.jpg)を読もうとしてエラーになっていますが、このjpgファイルはちゃんとしたファイルですか?
nonnon615

2021/01/05 14:36

最初pngとなっていたため途中から訂正したところこのようになりました。画像は問題なく開けます
TakaiY

2021/01/05 14:47 編集

ちょっと調べたら、cv2はpathlibのPathを読めないようです。すみません。 img = cv.imread(step_img_file) を img = cv.imread(str(step_img_file)) にしてみていただけますか? また、ついでに、 cv2.imwrite('grid_(\04d+).jpg',img) を cv2.imwrite(f'grid_{i:04d}.jpg',img) に変えておいてください。
nonnon615

2021/01/05 14:52

変えましたが、何も変わりませんでした…
TakaiY

2021/01/05 14:53

何も変わらないというのは、どういうことでしょう。 実行して表示される内容を貼ってみてください。
nonnon615

2021/01/05 15:00 編集

実行結果です images1\0001.jpg Traceback (most recent call last): File "C:\Users\Desktop\新しいフォルダー\1.py", line 36, in <module> img[:, k:img_x:x_step, :] = 0 TypeError: slice indices must be integers or None or have an __index__ method
TakaiY

2021/01/05 15:08

変らなくは無いですよね。 エラーの発生箇所と内容が変っています。 ここにあるようなエラーメッセージは問題の内容を示していますので、内容を読んで理解するようにしないと、先には進めませんよ。 エラーには、slice indices must be integers : スライスのインデックスは整数でないとだめって書いてあります。 k、 img_x、 x_step はすべて整数でなければいけませんが、どうですか?
TakaiY

2021/01/05 15:11

別件ですけど、i の初期化の場所はここではなくて、for文の前に出さないとだめですね。 いつも1になってしまう。
nonnon615

2021/01/05 15:20

iの位置をずらし実行すると images1\0001.jpg 101 101 1.0 100.0 98 90 Traceback (most recent call last): File "C:\Users\Desktop\新しいフォルダー\1.py", line 36, in <module> img[:, k:img_x:x_step, :] = 0 TypeError: slice indices must be integers or None or have an __index__ method このようになり,浮動小数点が原因と考え,round = lambda x: int(x * 2 + 1) // 2としたところ, images1\0001.jpg 101 101 1 100 1367 2048 images1\0002.jpg 101 101 2 99 1367 2048 このように実行できました!ありがとうございます! しかし,images2内に保存できませんでした.どのようにしたらよいでしょうか
TakaiY

2021/01/05 15:28

cv2.imwrite(f'grid_{i:04d}.jpg',img) ここで指定している文字列はファイルの名前でなくて、パスです。 パスというのはディレクトリ名を含んだもののことです。 なので、images2 に保存したいのであれば、保存するファイルのパスにimages2を含めてやればOKです。 cv2.imwrite(f'images2\\grid_{i:04d}.jpg',img) この ようなファイルやフォルダなどの名前の扱いについても調べて考えかたや操作のしかたを理解しておくといいですよ。
nonnon615

2021/01/05 15:36

できました!本当にありがとうございます! プログラムを自分で作成していく手順がわかってきた気がします! 勉強になりました。 本当にありがとうございました! またなにかあればよろしくお願いいたします。
guest

回答1

0

ベストアンサー

  • print文を各所に入れて、各ポイントで変数にどのような値が入っているか確認する。

  • エラーメッセージの内容を確認する。

  • 変数の初期化の場所がおかしいので修正する。

  • 出力ファイルの名前は書き方が不正なので修正する

投稿2021/01/05 15:31

TakaiY

総合スコア13765

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

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

nonnon615

2021/01/05 15:37 編集

本当にありがとうございます! プログラムを自分で作成していく手順がわかってきた気がします! 勉強になりました。 本当にありがとうございました! またなにかあればよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問