2015-12-24 1 views
1

Я работаю над съемкой с веб-камерой, подключенной к модели Raspberry Pi 2 B. Затем я обнаруживаю лицо на картинке и обрезаю лицо и сохраняю его как отдельное изображение. Приведенный ниже код отлично работал в Windows.обрезка изображения OpenCV 2 на Raspbian

import numpy as np 
import cv2 
import math 
from random import random 

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 
cap = cv2.VideoCapture(0) 
ret,frame = cap.read() 

#naming the image and save path 

img_name = str(int(math.ceil(100000*random()))) 
img_path = 'images/'+img_name+'.png' 
crop_img_path = 'images/'+'crop_'+img_name+'.png' 

# directly saving the image 
cv2.imwrite(img_path,frame) 

cap.release() 

img = cv2.imread(img_path) #read image to numeric array 

#printing image information 
print str(img.shape) + " " 
print str(img.size) + " " 
print str(img.dtype) 

#detecting face 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
face_cascade.load('haarcascade_frontalface_default.xml') 
faces = face_cascade.detectMultiScale(gray, 1.3, 5) 
for (x,y,w,h) in faces: 
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # drawing rectangle (Blue, thickness 2) 
    print str(x)+" "+str(y)+" "+str(x+w)+" "+str(y+h) #printing region coordinates of rectangle 
    crop_img = img[y:y+h,x:x+w] 
    cv2.imwrite(crop_img_path,crop_img) 

Но это дает следующее сообщение об ошибке в Raspbian:

Traceback (most recent call last): 
File "xyz.py", line 35, in <module> 
crop_img = img[y:y+h,x:x+w] 
TypeError: 'NoneType' object has no attribute '__getitem__' 

Примечание 1: Оригинал Захваченное изображение сохраняется в папке изображений.

Примечание 2: Я установил OpenCV для Python с помощью команды последующей:

sudo apt-get install python-opencv 

ответ

2

Ваш вопрос на этой линии: img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) и здесь вы переназначения img к None так что вы потеряете это оригинальный объект.

Ссылаясь на OpenCV2 documentation, cv2.rectangle возвращает None.

Таким образом,

crop_img = img[y:y+h,x:x+w] дает сообщение об ошибке

прямоугольник

Рисует простой, толстый или засыпанных правый прямоугольник.

С ++: пустота прямоугольник (Мат & IMG, точка PT1, точка pt2, Const Скалярное & цвет, Int толщина = 1, INT Linetype = 8, INT сдвиг = 0)

C++: недействительным прямоугольник (Мат & IMG, Rect ЗАП, Const Скалярное & цвет, INT толщина = 1, INT Linetype = 8, INT сдвиг = 0)

Python: cv2.rectangle (IMG, PT1, PT2, цвет [, толщина [, lineType [, shift]]]) → None

С: пустота cvRectangle (CvArr * IMG, CvPoint PT1, CvPoint pt2, CvScalar цвет, толщина INT = 1, INT line_type = 8, INT сдвиг = 0)

Python: cv.Rectangle (IMG, pt1, pt2, цвет, толщина = 1, LineType = 8, сдвиг = 0) → None

так как исправления в код, вы не должны повторно назначить img, но вместо этого сделать:

for (x,y,w,h) in faces: 
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # drawing rectangle (Blue, thickness 2) 
    print str(x)+" "+str(y)+" "+str(x+w)+" "+str(y+h) #printing region coordinates of rectangle 
    crop_img = img[y:y+h,x:x+w] 
    cv2.imwrite(crop_img_path,crop_img) 
+0

Почему это работает в Windows? – alloyeduniv

+0

Работает ли он в Raspbian, если вы применяете мой ответ? –

+0

Да, да. Извините, забыл отметить его правильно. Благодарю. – alloyeduniv

 Смежные вопросы

  • Нет связанных вопросов^_^