Hiromi1623
@Hiromi1623

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Pythonのプログラムが上手く動きません。

解決したいこと

PythonでYOLOv5を使い、車載カメラから撮影した夜間の画像を、上下に二分割した後にガンマ補正をかけて認識率の向上を行うプログラムを作成しました。
最初の画像を読み込む部分は正常に起動した(と思われる)のですが、分割した画像や検出した画像が出力されずに困っています。対処法を教えていただけませんか?

発生している問題・エラー

実行結果
[画像ファイル複数]
画像ファイル複数
finish
[]
[]
finish
[]
[]

※分割した画像・検出結果を格納するファイルが出力されません。

該当するソースコード

#coding:shift_jis
import glob

#フォルダの読み込み
file = glob.glob('C:/Users/RE12/Pictures/drive/*.jpg')
 
print(file)

import cv2
import numpy as np

#画像ファイルを領域別に分割
i=0
for x in file:
 print(x)
 img = cv2.imread(x)
    
  #上半分の領域指定及び分割
img1 = img[0 : 534, 0: 1273]
cv2.imwrite("C:/Users/RE12/Pictures/trim1e/"+str(i)+".jpg", img1)
#下半分の領域指定及び分割
img2 = img[ 179: 713, 0 : 1273]
cv2.imwrite("C:/Users/RE12/Pictures/trim2e/"+str(i)+".jpg", img2)
i+=1

print("finish")

import glob

#分割したファイルの読み込み
file1 = glob.glob('C:/Users/RE12/Pictures/trim1e/*.jpg')
file2 = glob.glob('C:/Users/RE12/Pictures/trim2e/*.jpg')

print(file1)
print(file2)

import cv2
import scipy.stats as sstats
import numpy as np

#上の領域にガンマ補正を施す
i=0
for x1 in file1:
    print(x1)
    img = cv2.imread(x1)
    
    mean=img.mean()
    print("平均値:",mean)
    
    gray = img
    
    #ガンマ補正値
    gamma = 0.5

    imax = gray.max()

    gray = imax * (gray / imax)**(1/gamma)

    cv2.imwrite("C:/Users/RE12/Pictures/edit1e/"+str(i)+".jpg", gray)
    i+=1

  #下の領域にガンマ補正を施す
i=0    
for x2 in file2:
    print(x2)
    img = cv2.imread(x2)
    
    mean=img.mean()
    print("平均値:",mean)
    
    gray = img
    
    #ガンマ補正値
    gamma = 0.9

    imax = gray.max()

    gray = imax * (gray / imax)**(1/gamma)

    cv2.imwrite("C:/Users/RE12/Pictures/edit2e/"+str(i)+".jpg", gray)
    i+=1
    
print("finish")

import glob

#ガンマ補正を施した領域別のファイルを読み込む
file1 = glob.glob('C:/Users/RE12/Pictures/edit1e/*.jpg')
file2 = glob.glob('C:/Users/RE12/Pictures/edit2e/*.jpg')
 
print(file1)
print(file2)

import cv2

i=0
for x1, x2 in zip(file1, file2):
    print(x1)
    print(x2)
    img1 = cv2.imread(x1)
    img2 = cv2.imread(x2)

    v_list = []

    v_list.append(img1)
    v_list.append(img2)

     #領域別のファイルを結合して一枚の画像ファイルを生成する
    image_v = cv2.vconcat(v_list)

   #保存先の指定
    cv2.imwrite("C:/Users/RE12/Pictures/mixdriveK/"+str(i)+".jpg", image_v)
    i+=1
print("finish")

0

1Answer

インデントが揃ってなかったり同じモジュールを何度も読み込んでるあたり、コピペコードでしょうか?

言いたいことは色々あるんですが、とりあえず気になったのは

i=0
for x in file:
 print(x)
 img = cv2.imread(x)
    
  #上半分の領域指定及び分割
img1 = img[0 : 534, 0: 1273]
cv2.imwrite("C:/Users/RE12/Pictures/trim1e/"+str(i)+".jpg", img1)
#下半分の領域指定及び分割
img2 = img[ 179: 713, 0 : 1273]
cv2.imwrite("C:/Users/RE12/Pictures/trim2e/"+str(i)+".jpg", img2)
i+=1

これじゃなくて

i=0
for x in file:
 print(x)
 img = cv2.imread(x)
    
  #上半分の領域指定及び分割
 img1 = img[0 : 534, 0: 1273]
 cv2.imwrite("C:/Users/RE12/Pictures/trim1e/"+str(i)+".jpg", img1)
 #下半分の領域指定及び分割
 img2 = img[ 179: 713, 0 : 1273]
 cv2.imwrite("C:/Users/RE12/Pictures/trim2e/"+str(i)+".jpg", img2)
 i+=1

こうでしょう
要はインデントをきちんと揃えましょうってことです
あと、for使いすぎじゃないですか?
一度に纏められる気もするんですが……

0Like

Comments

  1. @Hiromi1623

    Questioner

    ご指摘ありがとうございます。
    インデントを統一してプログラムを実行しなおしたのですが、画像を分割して保存するためのフォルダを開く際にエラーが発生してしまいます。何か対処法はございませんか?

    エラー内容
    「C:/Users/RE12/Pictures/drive\bandicam 2021-11-23 14-46-29-964.jpg
    [ WARN:0@0.040] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (773) cv::imwrite_ imwrite_('C:/Users/RE12/Pictures/trim1e/0.jpg'): can't open file for writing: permission denied」
  2. コード内にimwriteを呼び出してる箇所が複数あるので、どこで出たのかが分からないとなんとも言えません
    エラーコード全文載せてくれませんか?
  3. @Hiromi1623

    Questioner

    遅くなり申し訳ございません。
    おかげで解決いたしました。
    ありがとうございます。

Your answer might help someone💌