说到计算机视觉,就不能不提到 OpenCV,它是一个历史悠久、功能丰富、社区活跃的开源视觉开发库。OpenCV 基于 C++ 编写,但提供了 Python、Ruby、MATLAB 等多种语言接口。这对于习惯使用 Python 开发的人工智能从业者来说非常方便。
对于opencv的安装,使用pip去换源进行安装。而在我们安装opencv后,在pycharm中引入并使用时,可能会出现没有提示的问题。
pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
为了解决这个问题,首先找到F:\Python\Anaconda\Lib\site-packages\cv2路径下的cv2.pyd文件。
将这个文件复制到site-packages文件夹下,就可以解决pycharm中opencv没有提示的问题。
img = cv2.imread("python.png")
cv2.imshow("img",img)#参数一:图片框名字
cv2.waitKey(0)#图片框保留
cv2.destroyWindow()
注意,这里读取出来的数据类型为numpy数组
img = np.empty((200, 200, 3), np.uint8)#uint8取值范围为0-255
img[..., 0] = 255
img[..., 1] = 0
img[..., 2] = 0
cv2.imwrite("1.jpg", img)#参数一:文件名字
cv2.imshow("img",img)#参数一:图片框名字
cv2.waitKey(0)#图片框保留
cv2.destroyWindow()
为numpy数组的第一个通道赋值为255,但是得到的图像颜色却为蓝色,opencv打开图像是以BGR的通道顺序打开的。
capture = cv2.VideoCapture(0)#读取摄像头
# capture = cv2.VideoCapture("test.mp4")#读取视频
while True:
ret,frame = capture.read()
cv2.imshow("frame",frame)
if cv2.waitKey(1) & 0xff == ord("q"):
break
capture.release()
cv2.destroyWindow()
读取视频是以连续的图片来展示的
img = cv2.imread("python.png")
img[...,0] = 0
img[...,1] = 0
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyWindow()
记住关键点:opencv打开的图片为numpy数组,而且为BGR格式
img = cv2.imread("python.png")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)#将图像转换为HSV格式
lower_blue = np.array([100, 200, 100])
upper_blue = np.array([200, 255, 200])
mask = cv2.inRange(hsv, lower_blue, upper_blue)#高于或低于阈值的赋值为0
cv2.imshow('frame', img)
cv2.imshow('mask', mask)
cv2.waitKey(0)
color=np.uint8([[[21,94,214]]])
hsv_color=cv2.cvtColor(color,cv2.COLOR_BGR2HSV)
print(hsv_color)
img = cv2.imread("python.png")
#直线 原图 坐标 坐标 颜色 粗细
cv2.line(img,(0,0),(50,50),color=(0,0,255),thickness=2)
#圆 原图 中心 半径 颜色 粗细
cv2.circle(img,(50,50),50,(255,0,0),thickness=2)
#椭圆 原图 中心 (长短轴) 椭圆旋转角度 起始角度 结束角度
cv2.ellipse(img,(50,50),(100,50),180,0,360,(0,255,0),2)
#矩形 原图 坐标 坐标
cv2.rectangle(img,(0,0),(50,50),(15,25,35),2)
#多边形 原图 坐标(必须用中括号扩起) 是否闭合
pts = np.array([[10, 5], [50, 10], [70, 20], [20, 30]], np.int32)
cv2.polylines(img,[pts],isClosed=True,color=(125,0,125),thickness=2)
#文字 原图 文字 坐标 字体 大小
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,"python",(150,150),font,4,(178,78,8),2)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyWindow()
给定一个阈值,将图像中大于这个阈值的像素转换为255,而小于这个阈值的像素点转换为0。二值化处理后整个图象只有黑色或者白色。
在图像进行二值化操作前,必须将图像转换为灰度图
自动选取最佳的阈值对整个图像进行二值化。
img = cv2.imread("python.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
cv2.imshow("gray",gray)
cv2.imshow('binary', binary)
cv2.waitKey(0)
img = cv2.imread("python.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
binary = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)
cv2.imshow("gray",gray)
cv2.imshow('binary', binary)
cv2.waitKey(0)
img = cv2.imread("python.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray,125,255,cv2.THRESH_BINARY)
cv2.imshow("gray",gray)
cv2.imshow('binary', binary)
cv2.waitKey(0)
其实在本质上就是numpy数组的加减法
img1 = cv2.imread("python.png")
img1 = cv2.resize(img1,(200,200))
img2 = cv2.imread("test.png")
img2 = cv2.resize(img2,(200,200))
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.bitwise_and() |
按位与 |
cv2.bitwise_or() |
按位或 |
cv2.bitwise_xor() |
按位异或 |
cv2.bitwise_not() |
按位取反 |
比如说按位与,当不为0的像素点与为0的像素点相与,则变为0.
img = cv2.imread("python.png")
mask = np.zeros(img.shape,dtype=np.uint8)
mask[100:400,200:400]=255
mask[100:500,100:200]=255
result = cv2.bitwise_and(img,mask)
cv2.imshow("img",img)
cv2.imshow("mask",mask)
cv2.imshow("result",result)
cv2.waitKey(0)
cv2.destroyWindow()
interpolation参数说明:
img = cv2.imread("python.png")
img1 = cv2.resize(img,(50,50),interpolation=cv2.INTER_CUBIC)#重新定义图片的尺寸
img2 = cv2.transpose(img)#对图片进行转置处理
img3 = cv2.flip(img,0)#1:水平翻转 0:垂直翻转 -1:水平垂直翻转
cv2.imshow("img",img)
cv2.imshow("img1",img1)
cv2.imshow("img2",img2)
cv2.imshow("img3",img3)
cv2.waitKey(0)
cv2.destroyWindow()
src = cv2.imread('python.png')
rows, cols, channel = src.shape
M = np.float32([[1, 0, 50], [0, 1, 50]])
# M = np.float32([[0.5, 0, 0], [0, 0.5, 0]]) #
# M = np.float32([[-0.5, 0, cols // 2], [0, 0.5, 0]])
# M = np.float32([[1, 0.5, 0], [0, 1, 0]])
# M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.7)
#原图 变换矩阵 输出图像的大小
dst = cv2.warpAffine(src, M, (cols, rows))
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyWindow()
img = cv2.imread("4.jpg")
#需要变换的位置
pts1 = np.float32([[25, 30], [179, 25], [12, 188], [189, 190]])
#变换后的位置
pts2 = np.float32([[0, 0], [200, 0], [0, 200], [200, 200]])
#得到变换矩阵
M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (200, 201))
cv2.imshow("src", img)
cv2.imshow("dst", dst)
cv2.waitKey(0)
膨胀操作以及下列的相关操作一般是对图像的二值化图进行操作。
#内核形状 内核尺寸
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.dilate(img, kernel)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)
img = cv.imread("11.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))
dst = cv.erode(img, kernel)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)
img = cv.imread("10.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
#原图 变换方式 内核 iterations:应用腐蚀操作的次数,可选项,默认值为 1
dst = cv.morphologyEx(img, cv.MORPH_OPEN, kernel, iterations=1)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)
img = cv.imread("10.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
#原图 变换方式 内核 iterations:应用腐蚀操作的次数,可选项,默认值为 1
dst = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel, iterations=1)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)
img = cv.imread("10.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
#原图 变换方式 内核 iterations:应用腐蚀操作的次数,可选项,默认值为 1
dst = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel, iterations=1)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)
img = cv.imread("10.jpg", 0)
kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
#原图 变换方式 内核 iterations:应用腐蚀操作的次数,可选项,默认值为 1
dst = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel, iterations=1)
cv.imshow('src', img)
cv.imshow('dst', dst)
cv.waitKey(0)