opencv人脸识别–opencv和python MultiScale
目录:
一、 Haar特征分类器介绍
二、detectMultiScale函数
三、python OpenCV 解决人脸识别报错
四、识别框的形状
五、代码
首先、来两张帅帅的识别效果图:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一、Haar特征分类器介绍
Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。
Haar特征分类器存放目录:OpenCV安装目录中的\data\ haarcascades目录下,opencv2.4.8版本下的Haar特征分类器如下:
1 |
haarcascade_eye<span class="hljs-preprocessor">.xml</span> haarcascade_eye_tree_eyeglasses<span class="hljs-preprocessor">.xml</span> haarcascade_frontalface_alt<span class="hljs-preprocessor">.xml</span> haarcascade_frontalface_alt_tree<span class="hljs-preprocessor">.xml</span> haarcascade_frontalface_alt2<span class="hljs-preprocessor">.xml</span> haarcascade_frontalface_default<span class="hljs-preprocessor">.xml</span> haarcascade_fullbody<span class="hljs-preprocessor">.xml</span> haarcascade_lefteye_2splits<span class="hljs-preprocessor">.xml</span> haarcascade_lowerbody<span class="hljs-preprocessor">.xml</span> haarcascade_mcs_eyepair_big<span class="hljs-preprocessor">.xml</span> haarcascade_mcs_eyepair_small<span class="hljs-preprocessor">.xml</span> haarcascade_mcs_leftear<span class="hljs-preprocessor">.xml</span> haarcascade_mcs_lefteye<span class="hljs-preprocessor">.xml</span> haarcascade_mcs_mouth<span class="hljs-preprocessor">.xml</span> haarcascade_mcs_nose<span class="hljs-preprocessor">.xml</span> haarcascade_mcs_rightear<span class="hljs-preprocessor">.xml</span> haarcascade_mcs_righteye<span class="hljs-preprocessor">.xml</span> haarcascade_mcs_upperbody<span class="hljs-preprocessor">.xml</span> haarcascade_profileface<span class="hljs-preprocessor">.xml</span> haarcascade_righteye_2splits<span class="hljs-preprocessor">.xml</span> haarcascade_smile<span class="hljs-preprocessor">.xml</span> haarcascade_upperbody<span class="hljs-preprocessor">.xml</span> |
根据命名就可以很快知道各个分类器的用途。
其中:haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是人脸识别的Haar特征分类器了。
二、detectMultiScale函数
cvHaarDetectObjects是opencv1中的函数,opencv2中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸。
1 |
rects = cascade<span class="hljs-preprocessor">.detectMultiScale</span>(img,<span class="hljs-number">1.3</span>, <span class="hljs-number">6</span>,cv2<span class="hljs-preprocessor">.CASCADE</span>_SCALE_IMAGE,(<span class="hljs-number">20</span>,<span class="hljs-number">20</span>)) |
img–待检测图片,一般为灰度图像加快检测速度;
rects–被检测物体的矩形框向量组;
其他参数–调节识别程度……
三、python OpenCV 解决人脸识别报错
1 |
错误提示: cv2.error: C:\builds\master_PackSlaveAddon-win64-vc12-<span class="hljs-keyword">static</span>\opencv\modules\objdetect\src\cascadedetect.cpp:<span class="hljs-number">1639</span>: error: (-<span class="hljs-number">215</span>) !empty() <span class="hljs-keyword">in</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">cv</span><span class="hljs-type">::CascadeClassifier</span><span class="hljs-type">::detectMultiScale</span></span> |
到底是什么问题呢?
1 |
face_cascade=cv2.CascadeClassifier(<span class="hljs-string">'haarcascade_frontalface_default.xml'</span>) |
我们在这段代码后面,加上下面这句话,就是你自己找下分类器文档的位置,把path写清楚。
1 |
face_cascade.<span class="hljs-built_in">load</span>(<span class="hljs-string">'D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml'</span>) |
四、识别框的形状
选择输出识别框的形状,对rects(被检测物体的矩形框向量组)中的数据进行处理
1 |
cv2<span class="hljs-preprocessor">.circle</span>(img, (<span class="hljs-built_in">x</span>, <span class="hljs-built_in">y</span>), r, (co1,co2,co3), <span class="hljs-number">2</span>) <span class="hljs-preprocessor">#圆形</span> cv2<span class="hljs-preprocessor">.rectangle</span>(img, (x1, y1), (x2, y2), (co1,co2,co3), <span class="hljs-number">2</span>) <span class="hljs-preprocessor">#矩形</span> |
Then it works happily ! φ(゜▽゜*)♪
再来张识别对比图:
五、代码
1 |
<span class="hljs-keyword">import</span> cv2 <span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">detect</span><span class="hljs-params">(img, cascade)</span>:</span> rects = cascade.detectMultiScale(img,<span class="hljs-number">1.3</span>, <span class="hljs-number">6</span>,cv2.CASCADE_SCALE_IMAGE,(<span class="hljs-number">20</span>,<span class="hljs-number">20</span>)) <span class="hljs-keyword">if</span> len(rects) == <span class="hljs-number">0</span>: <span class="hljs-keyword">return</span> [] rects[:, <span class="hljs-number">2</span>:] += rects[:, :<span class="hljs-number">2</span>] <span class="hljs-keyword">print</span> rects <span class="hljs-keyword">return</span> rects <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">draw_rects</span><span class="hljs-params">(img, rects)</span>:</span> r =<span class="hljs-number">0</span> x = <span class="hljs-number">0</span> y = <span class="hljs-number">0</span> num = <span class="hljs-number">0</span> <span class="hljs-keyword">for</span> x1, y1, x2, y2 <span class="hljs-keyword">in</span> rects: num = num + <span class="hljs-number">1</span> co1 = <span class="hljs-number">0</span> co2 = <span class="hljs-number">0</span> co3 = <span class="hljs-number">0</span> <span class="hljs-keyword">if</span>(num%<span class="hljs-number">3</span> == <span class="hljs-number">0</span>): co1 = <span class="hljs-number">255</span> <span class="hljs-keyword">if</span>(num%<span class="hljs-number">3</span> == <span class="hljs-number">1</span>): co2 = <span class="hljs-number">255</span> <span class="hljs-keyword">if</span>(num%<span class="hljs-number">3</span> == <span class="hljs-number">2</span>): co3 = <span class="hljs-number">255</span> x = np.int((x1 + x2) * <span class="hljs-number">0.5</span>) y = np.int((y1 + y2) * <span class="hljs-number">0.5</span>) r = np.int(( abs(x1 - x2) + abs(y1-y2) ) * <span class="hljs-number">0.25</span>) cv2.circle(img, (x, y), r, (co1,co2,co3), <span class="hljs-number">2</span>) img = cv2.imread(<span class="hljs-string">"2.jpg"</span>) cv2.namedWindow(<span class="hljs-string">"frame"</span>, cv2.WINDOW_NORMAL) cv2.imshow(<span class="hljs-string">"frame"</span>, img) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) face_cascade=cv2.CascadeClassifier(<span class="hljs-string">'haarcascade_frontalface_default.xml'</span>) face_cascade.load(<span class="hljs-string">'D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml'</span>) rects = detect(gray, face_cascade) vis = img.copy() draw_rects(vis,rects) cv2.namedWindow(<span class="hljs-string">"facedetect"</span>, cv2.WINDOW_NORMAL) cv2.imshow(<span class="hljs-string">"facedetect"</span>, vis) cv2.imwrite(<span class="hljs-string">"facedetect.jpg"</span>, vis) cv2.waitKey(<span class="hljs-number">0</span>) cv2.destroyAllWindows() |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
当然,这个识别效果也不是特别好,再来张识别对比图(头像太小识别效果不是特别准确):
**
END
**