signed

QiShunwang

“诚信为本、客户至上”

opencv入门使用

2020/8/19 20:58:26   来源:

Opencv入门使用<1>

学习国外视频之后手打的教程,若有不对的地方请留言==

1.显示图片

import cv2

img = cv2.imread("./resources/KS.jpg")
//窗口名称, 图片对象
cv2.imshow('Output', img)
//图片永久停留, n*1000: 停留n秒后消失
cv2.waitKey(0)

效果
在这里插入图片描述

2.显示视频

cap = cv2.VideoCapture("./resources/twilight.mp4")

#设置循环,读取视频=读取每一帧图片
while True:
    success, img = cap.read()
    cv2.imshow("Video", img)
    //视频持续播放,如果按s键(设定的字母用小写),视频关闭
    if cv2.waitKey(1) & 0xFF == ord('s'):
        break

效果
在这里插入图片描述

3.启用摄像头

//0表示使用的摄像头,有1个摄像头就填入0
cap = cv2.VideoCapture(0)
//3代表宽度项,640为设置的宽度值
cap.set(3, 640)
//4代表高度项,480为设置的高度值
cap.set(4, 480)
//10代表亮度项, 100为设置的亮度
cap.set(10, 100)

while True:
    success, img = cap.read()
    cv2.imshow("Video", img)
    //摄像头持续开着,如果按s键(设定的字母用小写),摄像头关闭
    if cv2.waitKey(1) & 0xFF == ord('s'):
        break

效果
我就不露镜了

4.原图–>灰度图

img = cv2.imread("resources/KS.jpg")
//使用cvtColor功能,把彩图img的通道BGR转到GRAY(opencv中彩图通道顺序是BGR)
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
//窗口名称,显示的图片
cv2.imshow('Gray Image', imgGray)
cv2.waitKey(0)

效果
在这里插入图片描述

5.原图–>灰度图–>高斯模糊图

img = cv2.imread("resources/KS.jpg")
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
//(blur1,blur2)是高斯核的大小,选取一般是奇数,模糊度和数字大小成正比
//进行滤波的图像的长宽比如果为1:1,那么选取blur时,一般设置blur1=blur2
//如果要进行滤波的图像的长宽比大致为m:n,那么选取blur时,尽量是blur1:blur2=m:n
//sigmaX – X方向上的高斯核标准偏差
imgBlur = cv2.GaussianBlur(imgGray, (3, 5), sigmaX=0)
cv2.imshow('Blur Image', imgBlur)
cv2.waitKey(0)

效果
在这里插入图片描述

6.原图–>边缘图

img = cv2.imread("resources/KS.jpg")
//两个阈值越大,轮廓线条越少
imgCanny = cv2.Canny(img, 200, 250) 
cv2.imshow('Canny Image', imgCanny)
cv2.waitKey(0)

效果
在这里插入图片描述

7.原图–>边缘图–>膨胀图

img = cv2.imread("resources/KS.jpg")
imgCanny = cv2.Canny(img, 200, 250)
//kernel是滑动窗口,在图像上进行从左到右,从上到下的平移,如果方框中存在白色,那么这个方框内所有的颜色都是白色
//uint8,表示变量是无符号整数,范围是0到255
//uint8是指0~2^8-1 = 255数据类型
kernel = np.ones((3, 3), np.uint8)
//iteration表示迭代的次数
imgDilation = cv2.dilate(imgCanny, kernel, iterations=1)
cv2.imshow('Dilation Image', imgDilation)
cv2.waitKey(0)

效果
在这里插入图片描述

8.原图–>边缘图–>膨胀图–>腐蚀图

img = cv2.imread("resources/KS.jpg")
imgCanny = cv2.Canny(img, 200, 250)
kernel = np.ones((3, 3), np.uint8)
imgDilation = cv2.dilate(imgCanny, kernel, iterations=1)
imgEroded = cv2.erode(imgDilation, kernel, iterations=1)
cv2.imshow('Eroded Image', imgEroded)
cv2.waitKey(0)

效果
在这里插入图片描述

9.图像尺寸变换

//(430, 690, 3) (h, w, 3)原始图像尺寸
img = cv2.imread("resources/car.png")
//opencv图像的起始坐标在左上角
//使用opencv变换时,输入的是(w, h) !!!
imgResize = cv2.resize(img, (350, 200))

cv2.imshow('Image', img)
cv2.imshow('Image Resize', imgResize)
cv2.waitKey(0)

效果
在这里插入图片描述

10.图片裁剪

img = cv2.imread("resources/car.png")
// (430, 690, 3) (h, w, 3)
print(img.shape)

// 正常裁剪,输入的是(h, w) !!!
imgCropped = img[50:350, 200:500]

cv2.imshow("Image", img)
cv2.imshow("Image Cropped", imgCropped)
cv2.waitKey(0)

效果
在这里插入图片描述

11.图片颜色变换

//创建一张全零的图片,每个像素的值范围是[0, 255]
img = np.zeros((512, 512, 3), np.uint8)
//设置每个像素的三通道值为255,0,0 (B R G)
img[:] = 255, 0, 0

cv2.imshow("Image", img)

cv2.waitKey(0)

效果
在这里插入图片描述

12.图片上加线条

//这是一张全黑图片,像素值0代表black
img = np.zeros((512, 512, 3), np.uint8)
//设置被覆盖的图片,线的起点(w, h),终点(w, h) !!!,颜色,宽度 
cv2.line(img, (0, 0), (300, 300), (0, 255, 0), thickness=3)

cv2.imshow("Image", img)

cv2.waitKey(0)

效果
在这里插入图片描述

13.图片上加矩形框

img = np.zeros((512, 512, 3), np.uint8)
//设置被覆盖的图片,矩形框的左上角点(w, h),右下角点(w, h) !!!,颜色,宽度 
cv2.rectangle(img, (0, 0), (250, 350), (0, 0, 255), thickness=2)

cv2.imshow("Image", img)

cv2.waitKey(0)

效果
在这里插入图片描述

img = np.zeros((512, 512, 3), np.uint8)
//设置被覆盖的图片,矩形框的左上角点(w, h),右下角点(w, h) !!!,颜色,矩形框填充满设置的颜色
cv2.rectangle(img, (0, 0), (250, 350), (0, 0, 255), cv2.FILLED)

cv2.imshow("Image", img)

cv2.waitKey(0)

效果
在这里插入图片描述

14.图片上加圆形

img = np.zeros((512, 512, 3), np.uint8)
//设置被覆盖的图片, 圆的中心坐标(w, h), 圆的半径,圆圈颜色,圆圈厚度
cv2.circle(img, (400, 50), 30, (255, 255, 0), 3)

cv2.imshow("Image", img)

cv2.waitKey(0)

效果
在这里插入图片描述

15.图片上加文字

img = np.zeros((512, 512, 3), np.uint8)
//设置被覆盖的图片, 文本,文本左下角的坐标(w, h), 文本字体,字体大小,字体颜色,字体厚度
cv2.putText(img, "Hello Space!", (300, 100), fontFace=cv2.FONT_HERSHEY_COMPLEX,
            fontScale=1, color=(300, 100, 0), thickness=2)

cv2.imshow("Image", img)

cv2.waitKey(0)

效果
在这里插入图片描述

16.透视变换

待透视变换图片
在这里插入图片描述

//待透视变换变换的图片
img = cv2.imread("./resources/card.png")
//Ace的左上角,右上角,左下角,右下角坐标(格式是ndarray)
pts1 = np.array([[146, 125], [389, 103], [192, 484], [460, 441]], dtype="float32")
//透视变换后Ace的左上角,右上角,左下角,右下角坐标(格式是ndarray)
pts2 = np.array([[0, 0], [width, 0], [0, height], [width, height]], dtype="float32")
//利用两对坐标得到透视变换矩阵matrix
matrix = cv2.getPerspectiveTransform(pts1, pts2)
//设置透视变换后Ace的w,h
width, height = 250, 350
//原图通过透视变换矩阵,变成了透视变换后的图像imgOutput
imgOutput = cv2.warpPerspective(img, matrix, (width, height))

cv2.imshow("Image", img)
cv2.imshow("Output", imgOutput)

cv2.waitKey(0)

效果
透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)

17.图片堆叠显示

原始图像
在这里插入图片描述

//原始图像:一只羊
img = cv2.imread("./resources/sheep.png")
//水平方向堆叠5张
imgHor = np.hstack((img, img, img, img, img))
//垂直方向堆叠3张
imgVer = np.vstack((img, img, img))

cv2.imshow("Horizontal", imgHor)
cv2.imshow("Vertical", imgVer)
cv2.waitKey(0)

效果
在这里插入图片描述
如果需要在堆叠前缩小或放大原始图片,可以使用方法八先把图像尺寸改变,再进行堆叠

18.图片转换成HSV形式

问:什么是HSV?
答:RGB 颜色空间是大家最熟悉的颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成。然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色 调 Hue,饱和度 Saturation,亮度 Value)是根据颜色的直观特性创建的一种颜色空间。

原始图像
在这里插入图片描述

//原始图像
img = cv2.imread("./resources/KS3.jpg")
//HSV图像, 把BGR通道转变成HSV
imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

cv2.imshow("Original", img)
cv2.imshow("HSV", imgHSV)
cv2.waitKey(0)

效果