opencv常用操作

1.读图片:

img = cv2.imread('D:\\Documents\\vscodedoc\\facenetproject\\timg.jpg',0)

  • 1:cv2.IMREAD_COLOR,默认值,读入彩色图片,忽略透明度
  • 0:cv2.IMREAD_GRAYSCALE,以灰度模式读取图片
  • -1:cv2.IMREAD_UNCHANGED,读入彩色图片,并保持透明度信息

调试过程中如出现:OpenCV(3.4.1) Error: Assertion failed (size.width>0 && size.height>0) in imshow, file /home/cc/software/opencv-3.4.1/modules/highgui/src/window.cpp, line 356
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(3.4.1) /home/cc/software/opencv-3.4.1/modules/highgui/src/window.cpp:356: error: (-215) size.width>0 && size.height>0 in function imshow

可能是相对路径问题,改为绝对路径即可解决。

2.写图片:

cv2.imwrite('timg1.jpg',img)

3.操作像素矩阵

以灰度模式读取的图片,矩阵为2D,以彩色模式读取的图片,矩阵为3D。

如:img = cv2.imread('D:\\Documents\\vscodedoc\\facenetproject\\timg.jpg',0),print(img.shape),结果为(664, 1000)

如:img = cv2.imread('D:\\Documents\\vscodedoc\\facenetproject\\timg.jpg',1),print(img.shape),结果为(664, 1000,3)

3D矩阵如下:[[[248 238 231] [248 238 231] [248 238 231] ... [242 228 216] [243 229 217] [243 229 217]]...

3维数值分别表示BGR值

4.摄像头捕获实时视频流并识别人脸

import cv2

 # 创建一个窗口

cv2.namedWindow('mycap')

 # 获取摄像头

cap=cv2.VideoCapture(0)

 # 加载分类器,分类器位置可以自行更改,注意用绝对路径,否则出错

classfier=cv2.CascadeClassifier('D:\\Documents\\vscodedoc\\facenetproject\\haarcascade_frontalface_alt2.xml')

#人脸框的颜色,采用rgb模型,这里表示g取255,为绿色框

color=(0,255,0)

while cap.isOpened():

    # ok表示摄像头读取状态,frame表示摄像头读取的图像

    ok,img=cap.read()

    if not ok :

        break

    # 灰度化在后面检测时可以降低计算量

    gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    # 利用分类器检测灰度图像中的人脸矩阵数,1.2和3分别为图片缩放比例和需要检测的有效点数

    faceRects=classfier.detectMultiScale(gray,scaleFactor=1.2,minNeighbors=3,minSize=(32,32))

    #大于0则检测到人脸     

    if len(faceRects) > 0:

        # 可能检测到多个人脸,用for循环单独框出每一张人脸

        for faceRect in faceRects:

            #获取框的左上的坐标,框的长宽

            x,y,w,h=faceRect

            # cv2.rectangle()完成画框的工作,这里外扩了10个像素以框出比人脸稍大一点的区域,从而得到相对完整一点的人脸图像;cv2.rectangle()函数的最后两个参数一个用于指定矩形边框的颜色,一个用于指定矩形边框线条的粗细程度。

            cv2.rectangle(img,(x-10,y-10),(x+w-10,y+h-10),color,2)

    # 将图像矩阵显示在一个窗口中

    cv2.imshow('mycap',img)

     # 等待10ms,10ms内没有按键操作就进入下一次while循环,从而得到10ms一帧的效果,waitKey返回在键盘上按的键

    c=cv2.waitKey(10)

    # 按键esc后break

    if c & 0xFF==27: 

        break

# 释放资源

cap.release()

cv2.destroyWindow('mycap')

你可能感兴趣的:(机器学习,OPENCV,计算机视觉)