opencv code doesn't run on raspberry pi
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 ...
you're throwing a wall of code at us, without even vaguely mentioning, what the problem is ?
I can recalled the code(back in 2015). It worked for me using raspberry pi webcam/picamera. Actually, I still used it without
imutils
.Remove
trap/exception
.why
frame2
? Here is link: Ball tracking