使用基于haar功能的cascades处理已保存的图像,我可以轻松获得opencv人脸检测:
from PIL import Image
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('pic.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
但我无法弄清楚如何打开网址图片并将其传递给face_cascade。我一直在玩cStringIO,但我不知道该怎么办......
import cv2.cv as cv
import urllib, cStringIO
img = 'http://scontent-b.cdninstagram.com/hphotos-prn/t51.2885-15/10424498_582114441904402_1105042543_n.png'
file = cStringIO.StringIO(urllib.urlopen(img).read())
source = Image.open(file).convert("RGB")
bitmap = cv.CreateImageHeader(source.size, cv.IPL_DEPTH_8U, 3)
cv.SetData(bitmap, source.tostring())
cv.CvtColor(bitmap, bitmap, cv.CV_RGB2BGR)
是否可以使用numpy数组?
source2 = Image.open(file)
imarr=numpy.array(source2,dtype=numpy.uint8)
我是初学者,所以我为糟糕的解释道歉。 非常感谢!!
答案 0 :(得分:0)
或者您可以使用VideoCapture()类打开网址图片。
请参阅下面的C ++代码,
VideoCapture cap;
if(!cap.open("http://docs.opencv.org/trunk/_downloads/opencv-logo.png")){
cout<<"Cannot open image"<<endl;
return -1;
}
Mat src;
cap>>src;
imshow("src",src);
waitKey();
答案 1 :(得分:0)
在您的第一个示例中,您使用OpenCV2.imread
在第二个示例中读取您的图像,您可能正在使用PIL.Image
然后尝试转换。
为什么不简单地将文件保存到临时目录,然后再次使用OpenCV2.imread
?