我试图通过使用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]]
一旦您从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])
来获取相应的文件名。您没有清除
B
、G
、R
、red
、green
和blue
列表。对于每个图像,上一个图像中的值会添加到列表中,因为您使用的是.append
。如果使用python3.3或更高版本或任何版本的del list[:]
,则应在使用list_name.clear()
函数处理完一个图像后清除列表。mouseRGB()
函数将仅在使用cv2.namedWindow('mouseRGB')
创建并使用cv2.setMouseCallback('mouseRGB',mouseRGB)
分配的图像窗口'mouseRGB'
实例上调用。在用户点击ESC
并且您从while(1)
循环中断之后,您调用cv2.destroyAllWindows()
,它将关闭/销毁mouseRGB
窗口,该窗口分配了回调函数,因此您的mouseRGB()
不会在第一个映像之后被调用。您只从第一个图像中获得R、G、B值,并且由于您没有清除列表,因此这些第一个值将被追加并添加到每个图像之后。不要在for循环中调用cv2.destroyAllWindows()
,这样可以解决问题。您可以在读取完所有图像后、for循环之后以及将数据添加到csv之前调用它。我已经用上面提到的更改修改了您的代码,这很好:
相关问题 更多 >
编程相关推荐