使用OpenCV和Python从URL图像进行人脸检测
我在用基于Haar特征的级联分类器进行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)
我还是个初学者,所以解释得不好,提前谢谢大家!!
2 个回答
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();
0
在你的第一个例子中,你使用了 OpenCV2.imread
来读取图片,而在第二个例子中,你可能是用 PIL.Image
来处理图片,然后再尝试转换。
为什么不直接把文件保存到一个临时文件夹,然后再用 OpenCV2.imread
来读取呢?