0

在这段代码中,我想用轨迹栏选择一种颜色的圆形对象,检测角落并围绕对象画一个圆圈`在这段代码中,它检测使用轨迹栏选择的任何颜色

import numpy as np
import cv2

def nothing(x):
    pass
#nparray=np.array((0,0), 0)
cv2.namedWindow('image')
B=0
G=0
R=0
b=0
g=0
r=0
# create trackbars for color change
cv2.createTrackbar('r','image',0,255,nothing)
cv2.createTrackbar('g','image',0,255,nothing)
cv2.createTrackbar('b','image',0,255,nothing)
cv2.createTrackbar('R','image',0,255,nothing)
cv2.createTrackbar('G','image',0,255,nothing)
cv2.createTrackbar('B','image',0,255,nothing)
web = cv2.VideoCapture(0)
while(1):
    base_high = np.array([B, G, R])
    base_low = np.array([b, g, r])
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break
    r = cv2.getTrackbarPos('r', 'image')
    g = cv2.getTrackbarPos('g', 'image')
    b = cv2.getTrackbarPos('b', 'image')
    R = cv2.getTrackbarPos('R', 'image')
    G = cv2.getTrackbarPos('G', 'image')
    B = cv2.getTrackbarPos('B', 'image')
    ret, frame = web.read()
    cv2.flip(frame, 3, frame)
    hrv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hrv, base_low, base_high)    
    mask=cv2.erode(mask,None,iterations=2)
    mask=cv2.dilate(mask,None,iterations=2)
    res = cv2.bitwise_and(frame, frame, mask=mask)
    #add next code
    frame=cv2.resize(frame,(400,300))
    mask=cv2.resize(mask,(400,300))
    res=cv2.resize(res,(400,300))
    cv2.imshow("original",frame)
    cv2.imshow("masked", mask)
    cv2.imshow("res", res)
cv2.destroyAllWindows()

之后,当我添加此代码时

cnt = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
    centro = None
    if len(cnt) > 0:
        m = max(cnt, key=cv2.contourArea)
        ((x, y), r) = cv2.minEnclosingCircle(m)
        M = cv2.moments(m)
        centro = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
        if r > 10:
            cv2.circle(res.copy(), (int(x), int(y)), int(r), (0, 255, 255), 2)

它给了我那个错误

C:\Python27\python.exe C:/Users/MY/OneDrive/trackbar-colorselection/demo.py
OpenCV Error: Assertion failed (lb.type() == ub.type()) in cv::inRange, file C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\core\src\arithm.cpp, line 1984
Traceback (most recent call last):
  File "C:/Users/MY/OneDrive/trackbar-colorselection/demo.py", line 41, in <module>
    mask = cv2.inRange(hrv, base_low, base_high)
cv2.error: C:\build\master_winpack-bindings-win64-vc14-static\opencv\modules\core\src\arithm.cpp:1984: error: (-215) lb.type() == ub.type() in function cv::inRange
4

1 回答 1

0

我的错误我重新编写了 r 并在 ((x, y), r) = cv2.minEnclosureCircle(m)

于 2016-12-28T17:11:57.943 回答