Как заставить открытое резюме показывать следующее имя файла и следующее значение при обработке теплового изображения? - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь получить значение температуры из нескольких изображений, используя openCV, используя значение RGB, щелкая мышью по точке, которую я хочу увидеть.

# Thermal-processing_v1.py

from PIL import Image
import math
import numpy as np
import os
import pandas as pd
import cv2

# Load images module
def loadImages():
    temp = os.listdir('.')
    temp.sort()
    gbr = []
    for i in temp:
        if(i.endswith('jpg')):
            gbr.append(i)

    return [os.path.join('.',f) for f in os.listdir('.') if f.endswith('.jpg')]

# Load images to python
filenames = loadImages()
images = []
gs = []

for file in filenames:
    gambar = cv2.imread(file)
    images.append(gambar)

# List of list
B = []
G = []
R = []
suhu = []
red = []
green = []
blue = []


# Mouse GUI   
def mouseRGB(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN: 
        colorsB = gambar[y,x,0]
        colorsG = gambar[y,x,1]
        colorsR = gambar[y,x,2]
        colors = gambar[y,x]
        R.append(colorsR)
        G.append(colorsG)
        B.append(colorsB)

# Mouse Window
cv2.namedWindow('mouseRGB')
cv2.setMouseCallback('mouseRGB',mouseRGB)

# Grayscale processing
for gray in images:
    gray_image = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
    gs.append(gray_image)

    while(1):
        cv2.imshow('mouseRGB',gray_image)
        if cv2.waitKey(0) & 0xFF == 27 :
            for r in R:
                red.append(float(r))
            for g in G:
                green.append(float(g))
            for b in B:
                blue.append(float(b))
            nr = [i * 0.3 for i in red]
            ng = [j * 0.59 for j in green]
            nb = [k * 0.11 for k in blue]
            lum = nr + ng + nb
            tem = [z * 0.1502339357 for z in lum]
            break       
    cv2.destroyAllWindows()
    temp = sum(tem)
    suhu.append([file,temp])
    print(suhu)
# Appending data to csv
img_df = pd.DataFrame(suhu ,columns = ['Image', 'Temperature'])
img_df.to_csv('Olah_Suhu.csv')

Все отлично работает для одногофайл изображения и значение, и если я нажимаю «esc», он продолжает переходить к следующему изображению. Но значение и имя файла все те же, что и в первом. И значение стало суммой значения, которое я нажимаю.

['./190530_0002T.jpg', 34.989483624529996]]
[['./190530_0002T.jpg', 34.989483624529996], ['./190530_0002T.jpg', 69.97896724905999]]
[['./190530_0002T.jpg', 34.989483624529996], ['./190530_0002T.jpg', 69.97896724905999], ['./190530_0002T.jpg', 104.96845087358999]]
[['./190530_0002T.jpg', 34.989483624529996], ['./190530_0002T.jpg', 69.97896724905999], ['./190530_0002T.jpg', 104.96845087358999], ['./190530_0002T.jpg', 139.95793449812004]]

1 Ответ

1 голос
/ 24 октября 2019
  1. Как только вы выйдете из цикла for, где вы загружаете каждое изображение в каталог, т.е. for file in filenames:, переменная file будет содержать имя последнего изображения в списке filenames. Так что если список filenames содержит 3 изображения, скажем, filenames = [1.jpg, 2.jpg, 3.jpg], переменная file будет иметь значение 3.jpg, как только вы выйдете из цикла, и это то, что вы добавляете в suhu список в строке suhu.append([file,temp]). Вот почему вы видите то же имя изображения. Чтобы решить эту проблему, используйте enumerate в цикле, который вы используете, чтобы получить каждое изображение для преобразования их в оттенки серого. Это даст вам каждое изображение и индекс изображения. Поэтому замените строку for gray in images: на for index, gray in enumerate(images): и используйте index, чтобы получить соответствующее имя файла, заменив suhu.append([file,temp]) на suhu.append([filenames[index], temp]).

  2. Вы не очищаете свой *Списки 1022 *, G, R, red, green и blue. Для каждого изображения значения из предыдущего изображения добавляются в список, так как вы используете .append. Вы должны очистить списки после того, как вы закончите с одним изображением, используя функцию list_name.clear(), если используете Python 3.3 или выше или del list[:] для любой версии.

  3. Функция mouseRGB() будет вызываться только для экземпляра окна изображения 'mouseRGB', созданного с помощью cv2.namedWindow('mouseRGB') и назначенного с помощью cv2.setMouseCallback('mouseRGB',mouseRGB). После того, как пользователь нажмет ESC и вы выйдете из цикла while(1), вы вызовете cv2.destroyAllWindows(), который закроет / уничтожит окно mouseRGB, которому была назначена функция обратного вызова, так что ваш mouseRGB() не будет вызван послепервое изображение. Вы получаете значения R, G, B только с первого изображения, и поскольку вы не очищали списки, эти первые значения добавлялись и добавлялись после каждого изображения. Не вызывайте cv2.destroyAllWindows() внутри цикла for, и это решит проблему. Вы можете вызвать его, как только прочитаете все изображения, после цикла for и непосредственно перед тем, как приложите данные к CSV.

Я изменил ваш код с изменениями, упомянутыми выше, и этоотлично работает:

# Thermal-processing_v1.py

from PIL import Image
import math
import numpy as np
import os
import pandas as pd
import cv2

# Load images module
image_dir = '.'
def loadImages():
    temp = os.listdir(image_dir)
    temp.sort()
    gbr = []
    for i in temp:
        if(i.endswith('jpg')):
            gbr.append(i)
    return [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith('.jpg')]

# Load images to python
filenames = loadImages()

images = []
gs = []

for file in filenames:
    gambar = cv2.imread(file)
    images.append(gambar)

# List of list
B = []
G = []
R = []
suhu = []
red = []
green = []
blue = []


# Mouse GUI   
def mouseRGB(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDOWN: 
        colorsB = gambar[y,x,0]
        colorsG = gambar[y,x,1]
        colorsR = gambar[y,x,2]
        colors = gambar[y,x]
        R.append(colorsR)
        G.append(colorsG)
        B.append(colorsB)        

# Mouse Window
cv2.namedWindow('mouseRGB')
cv2.setMouseCallback('mouseRGB',mouseRGB)

# Grayscale processing
for index, gray in enumerate(images):
    gray_image = cv2.cvtColor(gray, cv2.COLOR_BGR2GRAY)
    gs.append(gray_image)

    while(1):
        cv2.imshow('mouseRGB',gray_image)
        if cv2.waitKey(0) & 0xFF == 27 :
            for r in R:
                red.append(float(r))
            for g in G:
                green.append(float(g))
            for b in B:
                blue.append(float(b))
            nr = [i * 0.3 for i in red]
            ng = [j * 0.59 for j in green]
            nb = [k * 0.11 for k in blue]
            lum = nr + ng + nb
            tem = [z * 0.1502339357 for z in lum]
            break       
    #cv2.destroyAllWindows()    
    temp = sum(tem)    
    suhu.append([filenames[index], temp])

    print(suhu)

    R.clear();
    G.clear();
    B.clear();

    red.clear();
    green.clear();
    blue.clear();

cv2.destroyAllWindows()    
# Appending data to csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...