如何从 python 中的逻辑语句中避免此弃用警告?
How to avoid this deprecation warning from a logical statement in python?
我正在使用 Basler 相机开发 4 的 GUI。在我的程序中,我面临两个导致 GUI 无法正确 运行 的问题。然而,主要目标是根据相机索引保存 4 张图像。我被告知要使用多线程技术来开发GUI,这些就是我遇到的问题。这些是代码:
def LiveThread(strIdx):
CamIdx = int(strIdx)
try:
panel[CamIdx] = None
image[CamIdx] = []
# Start Grabbing
camera[CamIdx].StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
print("Cam",CamIdx,': Start Grabbing')
iterator = 0
while bLiveThraed[CamIdx]:
grabResult = camera[CamIdx].RetrieveResult(5000, pylon.TimeoutHandling_ThrowException)
if grabResult.GrabSucceeded():
image[CamIdx] = converter[CamIdx].Convert(grabResult) # Access the openCV image data
image[CamIdx] = image[CamIdx].GetArray() # change them to an array for easy access
if(image[CamIdx] != []):
image[CamIdx] = cv2.cvtColor(image[CamIdx], cv2.COLOR_BGR2RGB)
image[CamIdx] = cv2.resize(image[CamIdx], (345,270))
image[CamIdx] = ImageTk.PhotoImage(image = Image.fromarray(image[CamIdx]))
if panel[CamIdx] is None:
panel[CamIdx] = tk.Label(image=image[CamIdx])
panel[CamIdx].image = image[CamIdx]
panel[CamIdx].pack(side="left")
panel[CamIdx].place(x=(345*CamIdx)+(20*CamIdx)+20, y=100)
panel[CamIdx] = tk.Label(image=image[CamIdx])
panel[CamIdx].image = image[CamIdx]
panel[CamIdx].pack(side="bottom")
panel[CamIdx].place(x=(345*CamIdx)+(20*CamIdx)+20, y=400)
#cv2.imwrite('./trial/camera'+str(CamIdx)+str(iterator)+'.jpg', image[CamIdx])
#iterator +=1
else:
panel[CamIdx].configure(image=image[CamIdx])
panel[CamIdx].image = image[CamIdx]
else:
print("Error: ", grabResult.ErrorCode)
grabResult.Release()
except genicam.GenericException as e:
# Error handling
print("An exception occurred.", e.GetDescription())
- 弃用警告如下图所示
- 在执行
cv2.imwrite('./trial/camera'+str(CamIdx)+str(iterator)+'.jpg', image[CamIdx])
后保存对应于其相机索引的每张图像如camera00、camera10、camera20、camera30的问题。产生的错误如下图所示。
生成的 GUI 如下图所示。
在下面的代码中,最后一行从opencv图像分配image[CamIdx]
成为cv2不能写下的ImageTk.PhotoImage
。在分配 image[CamIdx] = ImageTk.PhotoImage(image = Image.fromarray(image[CamIdx]))
.
之前考虑将 image[CamIdx]
存储到另一个变量
if(image[CamIdx] != []):
image[CamIdx] = cv2.cvtColor(image[CamIdx], cv2.COLOR_BGR2RGB)
image[CamIdx] = cv2.resize(image[CamIdx], (345,270))
image[CamIdx] = ImageTk.PhotoImage(image = Image.fromarray(image[CamIdx]))
到
save_img = None
if(image[CamIdx] != []):
image[CamIdx] = cv2.cvtColor(image[CamIdx], cv2.COLOR_BGR2RGB)
image[CamIdx] = cv2.resize(image[CamIdx], (345,270))
save_img = image[CamIdx]
image[CamIdx] = ImageTk.PhotoImage(image = Image.fromarray(image[CamIdx]))
cv2.imwrite('img.jpg',save_img)
对于弃用警告,以防 OP 想要检查 None 图片,正如 Christoph Rackwitz 在评论中指出的那样:don't use [] as a sentinel. use None. test with is None, not equality comparison.
我正在使用 Basler 相机开发 4 的 GUI。在我的程序中,我面临两个导致 GUI 无法正确 运行 的问题。然而,主要目标是根据相机索引保存 4 张图像。我被告知要使用多线程技术来开发GUI,这些就是我遇到的问题。这些是代码:
def LiveThread(strIdx):
CamIdx = int(strIdx)
try:
panel[CamIdx] = None
image[CamIdx] = []
# Start Grabbing
camera[CamIdx].StartGrabbing(pylon.GrabStrategy_LatestImageOnly)
print("Cam",CamIdx,': Start Grabbing')
iterator = 0
while bLiveThraed[CamIdx]:
grabResult = camera[CamIdx].RetrieveResult(5000, pylon.TimeoutHandling_ThrowException)
if grabResult.GrabSucceeded():
image[CamIdx] = converter[CamIdx].Convert(grabResult) # Access the openCV image data
image[CamIdx] = image[CamIdx].GetArray() # change them to an array for easy access
if(image[CamIdx] != []):
image[CamIdx] = cv2.cvtColor(image[CamIdx], cv2.COLOR_BGR2RGB)
image[CamIdx] = cv2.resize(image[CamIdx], (345,270))
image[CamIdx] = ImageTk.PhotoImage(image = Image.fromarray(image[CamIdx]))
if panel[CamIdx] is None:
panel[CamIdx] = tk.Label(image=image[CamIdx])
panel[CamIdx].image = image[CamIdx]
panel[CamIdx].pack(side="left")
panel[CamIdx].place(x=(345*CamIdx)+(20*CamIdx)+20, y=100)
panel[CamIdx] = tk.Label(image=image[CamIdx])
panel[CamIdx].image = image[CamIdx]
panel[CamIdx].pack(side="bottom")
panel[CamIdx].place(x=(345*CamIdx)+(20*CamIdx)+20, y=400)
#cv2.imwrite('./trial/camera'+str(CamIdx)+str(iterator)+'.jpg', image[CamIdx])
#iterator +=1
else:
panel[CamIdx].configure(image=image[CamIdx])
panel[CamIdx].image = image[CamIdx]
else:
print("Error: ", grabResult.ErrorCode)
grabResult.Release()
except genicam.GenericException as e:
# Error handling
print("An exception occurred.", e.GetDescription())
- 弃用警告如下图所示
- 在执行
cv2.imwrite('./trial/camera'+str(CamIdx)+str(iterator)+'.jpg', image[CamIdx])
后保存对应于其相机索引的每张图像如camera00、camera10、camera20、camera30的问题。产生的错误如下图所示。
生成的 GUI 如下图所示。
在下面的代码中,最后一行从opencv图像分配image[CamIdx]
成为cv2不能写下的ImageTk.PhotoImage
。在分配 image[CamIdx] = ImageTk.PhotoImage(image = Image.fromarray(image[CamIdx]))
.
image[CamIdx]
存储到另一个变量
if(image[CamIdx] != []):
image[CamIdx] = cv2.cvtColor(image[CamIdx], cv2.COLOR_BGR2RGB)
image[CamIdx] = cv2.resize(image[CamIdx], (345,270))
image[CamIdx] = ImageTk.PhotoImage(image = Image.fromarray(image[CamIdx]))
到
save_img = None
if(image[CamIdx] != []):
image[CamIdx] = cv2.cvtColor(image[CamIdx], cv2.COLOR_BGR2RGB)
image[CamIdx] = cv2.resize(image[CamIdx], (345,270))
save_img = image[CamIdx]
image[CamIdx] = ImageTk.PhotoImage(image = Image.fromarray(image[CamIdx]))
cv2.imwrite('img.jpg',save_img)
对于弃用警告,以防 OP 想要检查 None 图片,正如 Christoph Rackwitz 在评论中指出的那样:don't use [] as a sentinel. use None. test with is None, not equality comparison.