如何使opencv在热图像处理中显示下一个文件名和下一个值?

2024-09-30 14:15:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过使用RGB值,通过鼠标点击我想看到的点,使用openCV从几个图像中获得一个温度值。你知道吗

# 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]]

Tags: toinimportforifoscv2temp
1条回答
网友
1楼 · 发布于 2024-09-30 14:15:54
  1. 一旦您从for循环中出来,在该循环中加载目录中的每个映像,即for file in filenames:,变量file将包含列表中最后一个映像的名称filenames。因此,如果列表filenames包含3个图像,比如说filenames = [1.jpg, 2.jpg, 3.jpg],那么变量file的值将是3.jpg,这就是您在suhu.append([file,temp])行的suhu列表中附加的内容。这就是为什么你看到相同的图像名称。要解决这个问题,请在循环中使用enumerate,让每个图像都转换为灰度。这将为您提供每个图像和图像的索引。因此,将for gray in images:行替换为for index, gray in enumerate(images):,并使用index通过将suhu.append([file,temp])替换为suhu.append([filenames[index], temp])来获取相应的文件名。

  2. 您没有清除BGRredgreenblue列表。对于每个图像,上一个图像中的值会添加到列表中,因为您使用的是.append。如果使用python3.3或更高版本或任何版本的del list[:],则应在使用list_name.clear()函数处理完一个图像后清除列表。

  3. mouseRGB()函数将仅在使用cv2.namedWindow('mouseRGB')创建并使用cv2.setMouseCallback('mouseRGB',mouseRGB)分配的图像窗口'mouseRGB'实例上调用。在用户点击ESC并且您从while(1)循环中断之后,您调用cv2.destroyAllWindows(),它将关闭/销毁mouseRGB窗口,该窗口分配了回调函数,因此您的mouseRGB()不会在第一个映像之后被调用。您只从第一个图像中获得R、G、B值,并且由于您没有清除列表,因此这些第一个值将被追加并添加到每个图像之后。不要在for循环中调用cv2.destroyAllWindows(),这样可以解决问题。您可以在读取完所有图像后、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

相关问题 更多 >

    热门问题