how can i fix this opencv error,i try to identifie a colored ball with turtlebot2 in ros kinetic

asked 2020-07-07 22:19:38 -0500

bebeto gravatar image

lo=(230,50,0)#couleur hsv min

#hi=(245,255,255)#couleur Hsv max
image=cv.cvtColor(img,cv.COLOR_BGR2HSV) #conversion de l'image rgb en hsv
mask=cv.inRange(image,lo,hi) #creation du mask
mask=cv.erode(image,None,iterations=4) #reperage des impuretes
mask=cv.dilate(mask,None,iterations=4)#efface les impuretes

#chercher les contours 
element = cv.findContours(mask,cv.RETR_LIST, cv.CHAIN_APPROX_SIMPLE)[-2] #capture de l'ensemble des contours de l'image

if len (element)>0: #tableau doit etre non vide
    if counter%4==0:#si la frequence est un multiple de 4
        X,Y = [],[]
        c=max(element,key=cv.contourArea)#forme la plus grande
        M = cv2.moments(c)#calcul du moment d'inertie de l'objet
        (cX, cY) = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))#centroide
        ((x,y),rayon)=cv.minEnclosingCircle(element) #description d'un cercle minimal autour de l'element detecte
        if rayon>10:#certitude que l'objet detecte n'est pas un bruit dans l'image en s'assurant que le rayon sup a 10 
            X.append(cX)#ajout a la liste des abscisses
            Y.append(cY)#--//-- des ordonne

    if X and Y:
        cX=int(sum(X)/len(X))#abscisse moyenne
        cY=int(sum(Y)/len(Y))#ordonne moyen
        cv.circle(mask,(cX,cY),5,(254,10,11),2)
        cv.putText(mask,"coordonne ("+cX +"," +" cY)",(cX+10,cY-10),cv.FONT_HERSHEY_SIMPLEX, FONT_HERSHEY_PLAIN,1,(0,0,255),1,cv.Line_AA) 

        return cX,cY,mask
    else :
        return -100,-100,mask

fonction recuperant l'image de turtlebot utilise la fontion du haut(opencv)

#pour retourner la position de l'objet detecte

def recup(data): global cX,cY,pub

convertir numpy -> RGB

image = bridge.compressed_imgmsg_to_cv2(data, "bgr8")#conversion de numpy ros en Rgb opencv
h , w = image.shape[:2] #recuperation de la hauteur et la largeur
cX,cY,result = find_ball(image)

creation d'un point

point=Point()
point.x=cX
point.y=cY
point.z=w
pub_point.publish(point)#publier la position du centre de l'objet

dessin sur l'image pour avoir une sorte de repere

length = int(w/100)
(startX, endX) = (int(cX - length), int(cX + length))
(startY, endY) = (int(cY - length), int(cY + length))
cv.line(image, (startX, cY), (endX, cY), (0, 0, 255), 2)
cv.line(image, (cX, startY), (cX, endY), (0, 0, 255), 2)

cv.imshow('result',result)
cv.waitKey(5)
cv.destroyAllWindows()

if __name__ == '__main__': global counter, X, Y, cX, cY, pub counter = 0 X, Y = [], [] rospy.init_node('find_ball', anonymous=True) #souscription a la camera pub=rospy.Subscriber("/camera/rgb/image_raw/compressed",CompressedImage,recup) bridge=CvBridge()#opencv en ros sub=rospy.Publisher("/ball_location",Point,queue_size=5) rospy.spin()

^COpenCV Error: Unsupported format or combination of formats ([Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only) in cvStartFindContours_Impl, file /tmp/binarydeb/ros-kinetic-opencv3-3.3.1/modules/imgproc/src/contours.cpp, line 199 Traceback (most recent call last): File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/topics.py", line 750, in _invoke_callback cb(msg) File ... (more)

edit retag flag offensive close merge delete