openCV超详细⼊门教程(python版)
涉及内容:
数据库中数据类型有哪些
背景提取
颜⾊过滤
边缘检测
⽤于对象识别的特征匹配
⼀般对象识别
你将需要两个主要的库,第三个可选:python-OpenCV,Numpy 和 Matplotlib。
⼀、加载图⽚
⾸先,我们正在导⼊⼀些东西,我已经安装了这三个模块。接下来,我们将img定义为ad(image file, parms)。默认值是
IMREAD_COLOR,这是没有任何 alpha 通道的颜⾊。如果你不熟悉,alpha 是不透明度(与透明度相反)。如果你需要保留 Alpha 通道,也可以使⽤IMREAD_UNCHANGED。很多时候,你会读取颜⾊版本,然后将其转换为灰度。如果你没有⽹络摄像机,这将是你在本教程中使⽤的主要⽅法,即加载图像。有usebean部署
你可以不使⽤IMREAD_COLOR …等,⽽是使⽤简单的数字。你应该熟悉这两种选择,以便了解某个⼈在做什么。对于第⼆个参数,可以使⽤-1,0或1。颜⾊为1,灰度为0,不变为-1。因此,对于灰度,可以执⾏cv2.imread(‘watch.jpg’, 0)。
⼀旦加载完成,我们使⽤cv2.imshow(title,image)来显⽰图像。从这⾥,我们使⽤cv2.waitKey(0)来等待,直到有任何按键被按下。⼀旦完成,我们使⽤cv2.destroyAllWindows()来关闭所有的东西。
import cv2
import matplotlib
import numpy
img = cv2.imread('sources/2.jpg',0)
cv2.imshow("myWindow", img)
cv2.waitKey(0)
二维数组jscv2.destroyAllWindows()
⼆、加载视频源
在这个 Python OpenCV 教程中,我们将介绍⼀些使⽤视频和摄像头的基本操作。 除了起始⾏,处理来⾃视频的帧与处理图像是⼀样的。我们来举例说明⼀下:
import numpy as np
import cv2
cap = cv2.VideoCapture(0)#从计算机上的第⼀个⽹络摄像头返回视频
while True:
ret, frame = ad()
#其中ret是布尔值,如果读取帧是正确的则返回True,如果⽂件读取到结尾,它的返回值就为False。
#frame就是每⼀帧的图像,是个三维矩阵。
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', gray)
if cv2.waitKey(0)&0xFF==ord('q'):
break
cv2.destroyAllWindows()
⾸先,我们导⼊numpy和cv2,没有什么特别的。 接下来,我们可以cap = cv2.VideoCapture(0)。 这将从你计算机上的第⼀个⽹络摄像头返回视频。 如果你正在观看视频教程,你将看到我正在使⽤1,因为我的第⼀个摄像头正在录制我,第⼆个摄像头⽤于实际的教程源。while(True): ret, frame = ad()
这段代码启动了⼀个⽆限循环(稍后将被break语句打破),其中ret和frame被定义为ad()。 基本上,ret是⼀个代表是否有返回的布尔值,frame是每个返回的帧。 如果没有帧,你不会得到错误,你会得到None。
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
在这⾥,我们定义⼀个新的变量gray,作为转换为灰度的帧。 注意这个BGR2GRAY。 需要注意的是,OpenCV 将颜⾊读取为 BGR(蓝绿⾊红⾊),但⼤多数计算机应⽤程序读取为 RGB(红绿蓝)。 记住这⼀点。
cv2.imshow(‘frame’,gray)
请注意,尽管是视频流,我们仍然使⽤imshow。 在这⾥,我们展⽰了转换为灰⾊的源。 如果你想同时显⽰,你可以对原始帧和灰度执⾏imshow,将出现两个窗⼝。
if cv2.waitKey(1) & 0xFF == ord(‘q’): break
这个语句每帧只运⾏⼀次。 基本上,如果我们得到⼀个按键,那个键是q,我们将退出while循环,然后运⾏:
这将释放⽹络摄像头,然后关闭所有的imshow()窗⼝。
在某些情况下,你可能实际上需要录制,并将录制内容保存到新⽂件中。 以下是在 Windows 上执⾏此操作的⽰例:
import cv2
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc,20.0,(640,480))
while True:
去重sql语句distinctret, frame = ad()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
out.write(frame)
cv2.imshow('frame',gray)
if cv2.waitKey(1)&0xFF==ord('q'):
break
cv2.destroyAllWindows()
这⾥主要要注意的是正在使⽤的编解码器,以及在while循环之前定义的输出信息。 然后,在while循环中,我们使⽤out.write()来输出帧。最后,在while循环之外,在我们释放摄像头之后,我们也释放out。
太好了,现在我们知道如何操作图像和视频。 如果你没有⽹络摄像头,你可以使⽤图像甚⾄视频来跟随教程的其余部分。 如果你希望使⽤视频⽽不是⽹络摄像头作为源,则可以为视频指定⽂件路径,⽽不是摄像头号码。
现在我们可以使⽤来源了,让我们来展⽰如何绘制东西。 此前你已经看到,你可以使⽤ Matplotlib 在图⽚顶部绘制,但是 Matplotlib 并不真正⽤于此⽬的,特别是不能⽤于视频源。 幸运的是,OpenCV 提供了⼀些很棒的⼯具,来帮助我们实时绘制和标记我们的源,这就是我们将在下⼀个教程中讨论的内容。
三、在图像上绘制和写字
在这个 Python OpenCV 教程中,我们将介绍如何在图像和视频上绘制各种形状。 想要以某种⽅式标记检测到的对象是相当普遍的,所以我们⼈类可以很容易地看到我们的程序是否按照我们的希望⼯作。 ⼀个例⼦就是之前显⽰的图像之⼀:
⿎励你使⽤⾃⼰的图⽚。 像往常⼀样,我们的起始代码可以是这样的:
import numpy as np
import cv2
img = cv2.imread(‘watch.jpg’,cv2.IMREAD_COLOR)
下⾯,我们可以开始绘制,这样:
cv2.line(img,(0,0),(150,150),(255,255,255),15)
python入门教程(非常详细)书cv2.imshow(‘image’,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.line()接受以下参数:图⽚,开始坐标,结束坐标,颜⾊(bgr),线条粗细。
结果在这⾥:
好吧,很酷,让我们绘制更多形状。 接下来是⼀个矩形:
这⾥的参数是图像,左上⾓坐标,右下⾓坐标,颜⾊和线条粗细。
圆怎么样?
cv2.circle(img,(100,63), 55, (0,255,0), -1)
这⾥的参数是图像/帧,圆⼼,半径,颜⾊和。 注意我们粗细为-1。 这意味着将填充对象,所以我们会得到⼀个圆。
线条,矩形和圆都很酷,但是如果我们想要五边形,⼋边形或⼗⼋边形? 没问题!
⾸先,我们将坐标数组称为pts(点的简称)。 然后,我们使⽤cv2.polylines来画线。 参数如下:绘制的对象,坐标,我们应该连接终⽌的和起始点,颜⾊和粗细。
import numpy as np
import cv2
img = cv2.imread('sources/2.jpg', cv2.IMREAD_COLOR)
pts = np.array([[10,5],[200,300],[200,400],[100,400],[50,10]], np.int32)
pts = shape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,255),5)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
你可能想要做的最后⼀件事是在图像上写字。 这可以这样做:
import numpy as np
import cv2
img = cv2.imread('sources/2.jpg',cv2.IMREAD_COLOR)
font = cv2.FONT_HERSHEY_SIMPLEX
如何制作网页列表cv2.putText(img,'OpenCV Tuts!',(10,400), font,2,(200,255,155),5, cv2.LINE_AA)
#参数依次为图⽚,⽂字,⽂字起始位置,font,⽂字⼤⼩,⽂字颜⾊,⽂字粗细,cv2.LINE_AA
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在下⼀个教程中,我们将介绍我们可以执⾏的基本图像操作。
四、图像操作
在 OpenCV 教程中,我们将介绍⼀些我们可以做的简单图像操作。 每个视频分解成帧。 然后每⼀帧,就像⼀个图像,分解成存储在⾏和列中的,帧/图⽚中的像素。 每个像素都有⼀个坐标位置,每个像素都由颜⾊值组成。 让我们列举访问不同的位的⼀些例⼦。
我们将像往常⼀样读取图像(如果可以,请使⽤⾃⼰的图像,但这⾥是我在这⾥使⽤的图像):
import cv2
import numpy as np
img = cv2.imread(‘watch.jpg’,cv2.IMREAD_COLOR)
现在我们可以实际引⽤特定像素,像这样:
px = img[55,55]
下⾯我们可以实际修改像素:
img[55,55] = [255,255,255]
之后重新引⽤:
px = img[55,55]
print(px)
现在应该不同了,下⾯我们可以引⽤ ROI,图像区域:
px = img[100:150,100:150]
print(px)
我们也可以修改 ROI,像这样:
img[100:150,100:150] = [255,255,255]
我们可以引⽤我们的图像的特定特征:
print(img.shape)
print(img.size)
print(img.dtype)
我们可以像这样执⾏操作:
watch_face = img[37:111,107:194] #[y1:y2,x1:x2] x为纵向,y为横向
img[0:74,0:87] = watch_facecv2.imshow(‘image’,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这会处理我的图像,但是可能不能⽤于你的图像,取决于尺⼨。这是我的输出:
这些是⼀些简单的操作。 在下⼀个教程中,我们将介绍⼀些我们可以执⾏的更⾼级的图像操作。
五、图像算术和逻辑运算
欢迎来到另⼀个 Python OpenCV 教程,在本教程中,我们将介绍⼀些简单算术运算,我们可以在图像上执⾏的,并解释它们的作⽤。 为
此,我们将需要两个相同⼤⼩的图像来开始,然后是⼀个较⼩的图像和⼀个较⼤的图像。 ⾸先,我将使⽤:和
⾸先,让我们看看简单的加法会做什么:
import cv2
import numpy as np
#500 x 250
img1 = cv2.imread('3D-Matplotlib.png')
img2 = cv2.imread('mainsvmimage.png')
add = img1+img2
cv2.imshow('add',add)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果:
你不可能想要这种混乱的加法。 OpenCV 有⼀个“加法”⽅法,让我们替换以前的“加法”,看看是什么:
add = cv2.add(img1,img2)
结果:
这⾥可能不理想。 我们可以看到很多图像是⾮常“⽩⾊的”。 这是因为颜⾊是 0-255,其中 255 是“全亮”。 因此,例如:(155,211,79) + (50, 170, 200) = 205, 381, 279…转换为(205, 255,255)。
接下来,我们可以添加图像,并可以假设每个图像都有不同的“权重”。 这是如何⼯作的:
import cv2
import numpy as np
img1 = cv2.imread('3D-Matplotlib.png')
img2 = cv2.imread('mainsvmimage.png')
weighted = cv2.addWeighted(img1,0.6, img2,0.4,0)
cv2.imshow('weighted',weighted)
cv2.waitKey(0)
cv2.destroyAllWindows()
对于addWeighted⽅法,参数是第⼀个图像,权重,第⼆个图像,权重,然后是伽马值,这是⼀个光的测量值。 我们现在就把它保留为零。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。