首页 > 解决方案 > 注释不同的对象python

问题描述

我无法为不同的对象注释这是代码

import os
import matplotlib.pyplot as plt
import cv2
from matplotlib.widgets import RectangleSelector
from generate_xml import write_xml

# global constants
img = None
tl_list = []
br_list = []
object_list = []

# constants
image_folder = 'images'
savedir = 'annotations'
obj = 'Blight'
obj2 = 'Downy Mildew'
obj3  = 'Leaf Spot'
obj4 = 'Webworm'
obj5 = 'Aphids'
obj6 = 'Leafminers'
obj7 = 'Healthy'

def line_select_callback(clk, rls):
    global tl_list
    global br_list
    global object_list
    tl_list.append((int(clk.xdata), int(clk.ydata)))
    br_list.append((int(rls.xdata), int(rls.ydata)))
    object_list.append(obj)
    object_list.append(obj2)
    object_list.append(obj3)
    object_list.append(obj4)
    object_list.append(obj5)
    object_list.append(obj6)
    object_list.append(obj7)


def onkeypress(event):
    global object_list
    global tl_list
    global br_list
    global img
    if event.key == 'q':
        print (object_list.append(obj2))
        write_xml(image_folder, img, object_list, tl_list, br_list, savedir)
        tl_list = []
        br_list = []
        object_list = []
        img = None
    elif event.key == 'd':
        print(object_list.append(obj3))
        write_xml(image_folder, img, object_list, tl_list, br_list, savedir)
        tl_list = []
        br_list = []
        object_list = []
        img = None


def toggle_selector(event):
    toggle_selector.RS.set_active(True)


if __name__ == '__main__':
    for n, image_file in enumerate(os.scandir(image_folder)):
        img = image_file
        fig, ax = plt.subplots(1, figsize=(10.5, 8))
        mngr = plt.get_current_fig_manager()
        mngr.window.setGeometry(250, 40, 800, 600)
        image = cv2.imread(image_file.path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        ax.imshow(image)

        toggle_selector.RS = RectangleSelector(
            ax, line_select_callback,
            drawtype='box', useblit=True,
            button=[1], minspanx=5, minspany=5,
            spancoords='pixels', interactive=True,
        )
        bbox = plt.connect('key_press_event', toggle_selector)
        key = plt.connect('key_press_event', onkeypress)
        plt.tight_layout()
        plt.show()
        plt.close(fig)

当我运行代码时,我收到这样的错误

None

Traceback (most recent call last):   File "C:\Users\User\Anaconda3\lib\site-packages\matplotlib\cbook\__init__.py", line 388, in process
    proxy(*args, **kwargs)   File "C:\Users\User\Anaconda3\lib\site-packages\matplotlib\cbook\__init__.py", line 228, in __call__
    return mtd(*args, **kwargs)   File "part6.py", line 53, in onkeypress
    write_xml(image_folder, img, object_list, tl_list, br_list, savedir)   File "C:\Users\User\Desktop\Disease-detection\generate_xml.py", line 11, in write_xml
    image = cv2.imread(img.path) AttributeError: 'NoneType' object has no attribute 'path' None

标签: python

解决方案


您的变量img被读取为None. 回溯告诉你这个

image = cv2.imread(img.path) AttributeError: 'NoneType' object has no attribute 'path' None

即使那行代码不是您编写的内容的一部分,您也可以(从回溯中)看到它源自

write_xml(image_folder, img, object_list, tl_list, br_list, savedir)

出于某种原因,您在None那里作为第二个参数传递,看起来 openCV 和 Python 对此并不完全满意。

最有可能的起源None来自你的onkeypress(event)函数的结尾,我们得到img = Noneifevent.key匹配qd.

在第一次按qd时,代码将运行良好,因为您已在img中启动if __name__ == '__main__'。但是,在第二次按键时,代码将引发错误(因为imgis now None)。

您应该重新考虑程序的流程,例如img在特定时间应该是什么。


推荐阅读