Ask Your Question
-2

opencv code doesn't run on raspberry pi

asked 2020-03-14 07:30:11 -0600

updated 2020-03-14 07:46:46 -0600

berak gravatar image

hello, I have been working on gesture recognition using raspberry pi and opencv, I am able to run the following code on my linux and windows machines but not on the raspberry pi, note that I am able to run other scripts on the raspberry pi

import cv2
import numpy as np
import math
import imutils
import time
from collections import deque
from imutils.video import VideoStream
import argparse
           # construct the argument parse
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video",
    help="path to the (optional) video file")
ap.add_argument("-b", "--buffer", type=int, default=32,
    help="max buffer size")
args = vars(ap.parse_args())

cap = cv2.VideoCapture(0)
pts = deque(maxlen=args["buffer"])
counter = 0
(dX, dY) = (0, 0)   
while(1):

    try:  #an error comes if it does not find anything in window as it cannot find contour of max area
          #therefore this try error statement

        ret, frame = cap.read()
        ret2, frame2 = cap.read()
        frame=cv2.flip(frame,1)
        frame2=cv2.flip(frame2,1)
        kernel = np.ones((3,3),np.uint8)
        frame2 = imutils.resize(frame2, width=600)
        blurred = cv2.GaussianBlur(frame2, (11, 11), 0)
        hsv2 = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV)



        #define region of interest
        roi=frame[100:300, 100:300]


        cv2.rectangle(frame,(50,50),(500,500),(0,255,0),0)    
        hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)



    # define range of skin color in HSV
        lower_skin = np.array([0,20,70], dtype=np.uint8)
        upper_skin = np.array([20,255,255], dtype=np.uint8)




     #extract skin colur imagw  
        mask = cv2.inRange(hsv, lower_skin, upper_skin)
        mask2 = cv2.inRange(hsv2, lower_skin, upper_skin)
        mask2 = cv2.erode(mask2, None, iterations=2)


         #extrapolate the hand to fill dark spots within
        mask = cv2.dilate(mask,kernel,iterations = 4)
        mask2 = cv2.dilate(mask2,None, iterations=2)
          #blur the image
        mask = cv2.GaussianBlur(mask,(5,5),100) 



          #find contours
        cnts,contours,hierarchy= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

          #find contour of max area(hand)
        cnt = max(contours, key = lambda x: cv2.contourArea(x))

          #approx the contour a little
        epsilon = 0.0005*cv2.arcLength(cnt,True)
        approx= cv2.approxPolyDP(cnt,epsilon,True)


           #make convex hull around hand
        hull = cv2.convexHull(cnt)

               #define area of hull and area of hand
        areahull = cv2.contourArea(hull)
        areacnt = cv2.contourArea(cnt)

              #find the percentage of area not covered by hand in convex hull
        arearatio=((areahull-areacnt)/areacnt)*100

          #find the defects in convex hull with respect to hand
        hull = cv2.convexHull(approx, returnPoints=False)
        defects = cv2.convexityDefects(approx, hull)

            # l = no. of defects
        l=0

        cnts2 = cv2.findContours(mask2.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
        cnts2 = imutils.grab_contours(cnts2)
        center = None
        c = max(cnts2, key=cv2.contourArea)
        ((x, y), radius) = cv2.minEnclosingCircle(c)
        M = cv2.moments(c)
        center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
        cv2.circle(frame, (int(x), int(y)),  10, [255,125,0], -1)
        pts.appendleft(center)

        for i in np.arange(1, len(pts)):

            if pts[i - 1] is None or pts[i] is None:

                continue


            if counter >= 5 and i == 1 and pts[-5] is not None:
                # compute ...
(more)
edit retag flag offensive close merge delete

Comments

you're throwing a wall of code at us, without even vaguely mentioning, what the problem is ?

berak gravatar imageberak ( 2020-03-14 07:47:25 -0600 )edit

I can recalled the code(back in 2015). It worked for me using raspberry pi webcam/picamera. Actually, I still used it without imutils.

supra56 gravatar imagesupra56 ( 2020-03-14 08:26:45 -0600 )edit

Remove trap/exception.

supra56 gravatar imagesupra56 ( 2020-03-14 09:59:15 -0600 )edit

why frame2? Here is link: Ball tracking

supra56 gravatar imagesupra56 ( 2020-03-14 10:29:09 -0600 )edit

1 answer

Sort by ยป oldest newest most voted
0

answered 2020-03-14 14:37:14 -0600

supra56 gravatar image

Sorry for reply. Try this:

import cv2
import numpy as np
import math
cap = cv2.VideoCapture(0)

while True:
    ret,frame = cap.read()
    frame=cv2.flip(frame,1)
    kernel = np.ones((3,3),np.uint8)

    #define region of interest   
    roi=frame[100:300, 100:300]
    cv2.rectangle(frame,(100,100),(300,300),(0,255,0),0)    
    hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)

    #define range of skin color in HSV   
    lower_skin = np.array([0,20,70], dtype=np.uint8)
    upper_skin = np.array([20,255,255], dtype=np.uint8)

    #extract skin colur imagw    
    mask = cv2.inRange(hsv, lower_skin, upper_skin)

    #extrapolate the hand to fill dark spots within   
    mask = cv2.dilate(mask,kernel,iterations = 4)    
    #blur the image  
    mask = cv2.GaussianBlur(mask,(5,5),100) 

    #find contours    
    cnts,contours,hierarchy= cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    #find contour of max area(hand)  
    cnt = max(contours, key = lambda x: cv2.contourArea(x))

    #approx the contour a little
    epsilon = 0.0005*cv2.arcLength(cnt,True)
    approx= cv2.approxPolyDP(cnt,epsilon,True)

    #make convex hull around hand   
    hull = cv2.convexHull(cnt)

    #define area of hull and area of hand   
    areahull = cv2.contourArea(hull)
    areacnt = cv2.contourArea(cnt)

    #find the percentage of area not covered by hand in convex hull    
    arearatio=((areahull-areacnt)/areacnt)*100

    #find the defects in convex hull with respect to hand   
    hull = cv2.convexHull(approx, returnPoints=False)
    defects = cv2.convexityDefects(approx, hull)

    #l = no. of defects    
    l=0

    #code for finding no. of defects due to fingers    
    for i in range(defects.shape[0]):
        s,e,f,d = defects[i,0]
        start = tuple(approx[s][0])
        end = tuple(approx[e][0])
        far = tuple(approx[f][0])
        pt= (100,180)

        #find length of all sides of triangle        
        a = math.sqrt((end[0] - start[0])**2 + (end[1] - start[1])**2)
        b = math.sqrt((far[0] - start[0])**2 + (far[1] - start[1])**2)
        c = math.sqrt((end[0] - far[0])**2 + (end[1] - far[1])**2)
        s = (a+b+c)/2
        ar = math.sqrt(s*(s-a)*(s-b)*(s-c))

        #distance between point and convex hull      
        d=(2*ar)/a

        #apply cosine rule here      
        angle = math.acos((b**2 + c**2 - a**2)/(2*b*c)) * 57

        #ignore angles > 90 and ignore points very close to convex hull(they generally come due to noise)       
        if angle <= 90 and d>30:
            l += 1
            cv2.circle(roi, far, 3, [255,0,0], -1)

        #draw lines around hand           
        cv2.line(roi,start, end, [0,255,0], 2)       

    l+=1

    #print corresponding gestures which are in their ranges   
    font = cv2.FONT_HERSHEY_SIMPLEX
    if l==1:
        if areacnt<2000:
            cv2.putText(frame,'Put hand in the box',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
        else:
            if arearatio<12:
                cv2.putText(frame,'0',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)
            elif arearatio<17.5:
                cv2.putText(frame,'Best of luck',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)

            else:
                cv2.putText(frame,'1',(0,50), font, 2, (0,0,255), 3, cv2.LINE_AA)

    elif l==2:
        cv2 ...
(more)
edit flag offensive delete link more

Question Tools

1 follower

Stats

Asked: 2020-03-14 07:30:11 -0600

Seen: 580 times

Last updated: Mar 14 '20