Opencv mit python und flask : HIGHGUI FEHLER: von libv4l unable to ioctl S_FMT
Ich versuche, ein Bild über eine webcam-feed in camera.py und senden an main.py in der Ausgabe angezeigt, die in einem Kolben erzeugten lokalen server . Aber ich traf die folgende Fehlermeldung
libv4l2: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl S_FMT
libv4l2: error setting pixformat: Device or resource busy
libv4l1: error setting pixformat: Device or resource busy
HIGHGUI ERROR: libv4l unable to ioctl VIDIOCSPICT
Ich verwendete den folgenden code:
main.py
from flask import Flask, render_template, Response
from camera import VideoCamera
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
def gen(camera):
while True:
frame = camera.get_frame()
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
@app.route('/video_feed')
def video_feed():
return Response(gen(VideoCamera()),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
camera.py
import cv2, time
import numpy as np
class VideoCamera(object):
def __init__(self):
# Using OpenCV to capture from device 0. If you have trouble capturing
# from a webcam, comment the line below out and use a video file
# instead.
self.video = cv2.VideoCapture(0)
# If you decide to use video.mp4, you must have this file in the folder
# as the main.py.
# self.video = cv2.VideoCapture('video.mp4')
def __del__(self):
self.video.release()
def get_frame(self):
success, frame = self.video.read()
# We are using Motion JPEG, but OpenCV defaults to capture raw images,
# so we must encode it into JPEG in order to correctly display the
# video stream.
#time.sleep(.1)
face_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascades/haarcascade_mcs_eyepair_small.xml')
# Load the overlay image: glasses.png
imgGlasses = cv2.imread('4.png', -1)
print imgGlasses is None
# Create the mask for the glasses
imgGlassesGray = cv2.cvtColor(imgGlasses, cv2.COLOR_BGR2GRAY)
#cv2.imwrite("imgGlassesGray.png", imgGlassesGray)
ret, orig_mask = cv2.threshold(imgGlassesGray, 0, 255, cv2.THRESH_BINARY)
#cv2.imwrite("orig_mask.png", orig_mask)
# Create the inverted mask for the glasses
orig_mask_inv = cv2.bitwise_not(orig_mask)
#cv2.imwrite("orig_mask_inv.png", orig_mask_inv)
# Convert glasses image to BGR
# and save the original image size (used later when re-sizing the image)
imgGlasses = imgGlasses[:,:,0:3]
origGlassesHeight, origGlassesWidth = imgGlasses.shape[:2]
video_capture = cv2.VideoCapture(0)
#while True:
#ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5, flags=cv2.cv.CV_HAAR_SCALE_IMAGE)
for (x,y,w,h) in faces:
cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex,ey,ew,eh) in eyes:
cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),1)
for (ex, ey, ew, eh) in eyes:
glassesWidth = 3*ew
glassesHeight = glassesWidth * origGlassesHeight / origGlassesWidth
# Center the glasses
x1 = ex - 15
x2 = ex + ew + 15
y1 = ey - 5
y2 = ey + eh + 15
# Check for clipping
if x1 < 0:
x1 = 0
if y1 < 0:
y1 = 0
if x2 > w:
x2 = w
if y2 > h:
y2 = h
# Re-calculate the width and height of the glasses image
glassesWidth = x2 - x1
glassesHeight = y2 - y1
# Re-size the original image and the masks to the glasses sizes
# calcualted above
glasses = cv2.resize(imgGlasses, (glassesWidth,glassesHeight), interpolation = cv2.INTER_AREA)
mask = cv2.resize(orig_mask, (glassesWidth,glassesHeight), interpolation = cv2.INTER_AREA)
mask_inv = cv2.resize(orig_mask_inv, (glassesWidth,glassesHeight), interpolation = cv2.INTER_AREA)
# take ROI for glasses from background equal to size of glasses image
roi = roi_color[y1:y2, x1:x2]
# roi_bg contains the original image only where the glasses is not
# in the region that is the size of the glasses.
roi_bg = cv2.bitwise_and(roi,roi,mask = mask)
# roi_fg contains the image of the glasses only where the glasses is
roi_fg = cv2.bitwise_and(glasses,glasses,mask = mask_inv)
# join the roi_bg and roi_fg
dst = cv2.add(roi_bg,roi_fg)
# place the joined image, saved to dst back over the original image
roi_color[y1:y2, x1:x2] = dst
break
ret, jpeg = cv2.imencode('.jpg', frame)
return jpeg.tobytes()
index.html
<html>
<head>
<title>Video Streaming Demonstration</title>
<link type="text/css" rel="stylesheet"
href="{{ url_for('static',
filename='styles.css')}}" />
<style>
body {
background-image: url(http://cdn.wall88.com/51b487f75df1050061.jpg);
background-repeat: no-repeat;
}
</style>
</style>
</head>
<body>
<h1>Video Streaming Demonstration</h1>
<img id="bg" align="middle" src="{{ url_for('video_feed') }}">
</body>
</html>
- Scheint, wie Ihre Kamera wird von einem anderen Programm verwendet, oder?
- I Dont think so. .. fand ich einen ähnlichen Fehler gelöst stackoverflow.com/questions/15177313/..., .. Aber ich weiß nicht, wie zu verwenden, dass in meinem Programm
- die
while True:
in Ihrem gen-Funktion macht dies ziemlich tricky. client1 ruft Ihre website auf, beginnt ein videofeed, dann lässt Website. nun, das bedeutet nicht, daß die Eroberung jemals geschlossen wird, so dass, wenn client2 versucht das gleiche - ha. - gibt es diese Funktion def __del__(self): self.video.release() in camera.py Datei... ist das nicht das gleiche tun ?
- versuchen Sie, melden Sie, wenn es überhaupt aufgerufen wird (ich Wette nicht)
- Also, was kann ich tun ?
- Ich hatte ein ähnliches Problem, es lag am Flachbandkabel etwas getrennt, ich versorgte alles aus, wieder angebracht wird das Flachbandkabel an die Pi und ich hatte nicht mehr die Fehler.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, entfernen
debug=True
immain.py
. Verursacht wurde das problem für mich.