开发者社区 问答 正文

python-3.x如何使用用户输入运行多种颜色识别?

我有一个学校项目,在该项目中,我必须制作一条跟车路线,必须根据用户输入遵循特定的颜色线。当我仅用一种颜色并且没有用户输入来测试汽车的路线跟随能力时,该代码就可以正常工作,但是当我添加多种颜色和用户输入时,汽车不再希望遵循一条路线而只是驶入日落。我试图尝试代码,但没有运气。这是代码的while循环。

try: while(True): user = int(input("1 for blue line")) time.sleep(1)

    ret, frame = cap.read()

    crop_img = frame[60:120, 0:160]

    _, img = cap.read()

    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

Tracking blue color

    if user == 1:
        blue_lower = np.array([99,115,150],np.uint8)
        blue_upper = np.array([110,255,255],np.uint8)
        blue = cv2.inRange(hsv, blue_lower, blue_upper)
        kernal = np.ones((5 ,5), "uint8")
        blue=cv2.dilate(blue,kernal)
        res=cv2.bitwise_and(img, img, mask = blue)

        (contours,hierarchy)=cv2.findContours(blue,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

        for pic, contour in enumerate(contours):
            area = cv2.contourArea(contour)
            if(area>300):

                    x,y,w,h = cv2.boundingRect(contour)
                    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

        Controls()

Tracking black color

    else:
        black_lower = np.array([0,0,0],np.uint8)
        black_upper = np.array([50,50,100],np.uint8)
        black = cv2.inRange(hsv, black_lower, black_upper)
        kernal = np.ones((5 ,5), "uint8")
        black = cv2.dilate(black,kernal)
        res2 = cv2.bitwise_and(img, img, mask = black)

        (contours,hierarchy)=cv2.findContours(black,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

        for pic, contour in enumerate(contours):
            area = cv2.contourArea(contour)
            if(area>300):

                    x,y,w,h = cv2.boundingRect(contour)
                    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)

        Controls()

展开
收起
被纵养的懒猫 2019-09-30 14:57:32 430 分享 版权
阿里云 AI 助理回答

从你提供的代码片段来看,你的项目涉及到使用OpenCV进行颜色识别和追踪,并根据用户输入选择追踪特定颜色的线。问题似乎出在代码逻辑以及可能的变量作用域或类型错误上。以下是一些建议来帮助你调试和改进代码:

  1. 用户输入处理:

    • 你的input函数只提供了蓝色路线的选择("1 for blue line"`),但没有为黑色或其他颜色提供选项。如果想要支持多色选择,请扩展输入提示并处理不同的用户输入。
    • 用户输入后直接跟了一个time.sleep(1),这可能会导致程序响应延迟,除非这是特意为了演示或控制节奏。
  2. 颜色范围定义:

    • 确保你定义的颜色范围(如blue_lowerblue_upper)准确地匹配了实际场景中的颜色。当前的范围可能过于狭窄或不精确,特别是对于蓝色,可能导致在某些光照条件下无法正确识别。
    • 黑色的范围定义可能也需要调整,因为[0,0,0]到[50,50,100]可能涵盖了过多非纯黑区域。
  3. 循环内的重复代码:

    • 你为每种颜色的追踪都重复了相似的代码块,包括颜色转换、范围检测、轮廓查找等。考虑将这些共通操作提取到一个函数中以减少代码冗余并提高可维护性。
  4. 潜在的逻辑错误:

    • 在计算边界框时,(x w,y h)看起来像是一个拼接错误,应该是(x+w,y+h)来正确表示矩形的右下角坐标。
    • Controls()函数调用没有显示其内容,确保它基于正确的参数(比如识别到的线的位置)来控制车辆,而不是无条件执行。
  5. 性能与稳定性:

    • 使用cv2.RETR_TREE作为findContours的检索模式可能不是最优选择,特别是在实时应用中。考虑使用cv2.RETR_EXTERNAL来仅获取最外层轮廓,减少计算量。
    • 检查Controls()函数内部是否对不同颜色有适当的处理逻辑,确保汽车能够根据识别到的线路做出正确反应。
  6. 调试建议:

    • 添加日志打印语句,比如输出每次循环识别到的轮廓数量、面积等信息,有助于理解程序运行时的具体情况。
    • 使用断点或print语句检查user变量是否按预期接收到了用户的输入,并且在不同分支下程序逻辑是否正确执行。

综上所述,你需要检查并修正上述提到的错误,同时优化代码结构,确保逻辑清晰且健壮。希望这些建议能帮助你解决问题!

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: