Python OpenCV入门





![首 先 , 我 们 正 在 导 入 一 些 东 西 , 我 已 经 安 装 了 汶 三 个 模 块 。 接 下 来 , 我 们 将 {mg 定 义 为 cv2.r ead(image file , parms) 。 默 认 值 是 IMREAD_COLOR 是 沿 有 任 何 alpha 通 道 的 颜 色 · 如 果 你 不 槧 悉 , a \] pha 是 不 透 明 度 ( 与 透 明 度 相 反 ), 如 槊 你 要 保 留 Alpha 通 道 , 也 可 以 使 用 IMREAD UNCHANGED 。 很 多 时 佞 , 你 刽 戔 取 颜 色 版 不 , 然 后 将 其 转 为 灰 。 如 果 你 没 有 网 络 禍 像 机 , 这 将 是 你 在 不 教 程 中 使 用 的 主 要 方 法 即 加 载 图 骁 你 可 以 不 使 用 INREAD_COLOR 等 . 而 是 使 用 同 单 的 数 字 。 你 应 该 这 两 种 选 择 . 以 便 了 解 某 个 人 在 做 什 么 。 对 于 第 二 个 参 数 , 可 以 使 用 一 1 , 0 或 1 . 颜 色 为 1 , 灰 度 为 不 变 为 . 1 . 因 此 , 对 于 灰 度 , 可 以 执 行 cv2.imread(•uatch.jpg', 劬 一 目 载 完 成 @ 我 们 使 用 “ 2 . imshow(title, image) 来 显 示 图 骁 从 这 里 , 我 们 雙 用 “ 2 .wai t 緶 y 〈 劬 来 等 待 , 直 到 有 任 何 按 踺 被 按 下 。 一 旦 完 成 , 我 们 使 用 cv2.destroyA11Windows() 来 关 闭 所 有 的 东 西 。](/uploads/projects/wsbo@ekqhd3/41ae5f1fda8f32676d20aba934444955.jpeg)
正如前面提到的,你也可以用 Matplotlib 显示图像,下面是一些如何实现的代码:![1 2 4 6 7 8 9 10 import cv2 import numpy as np from matplotlib import pyplot as plt cv2. imread( watch. jpg • , cv2. IMREAD GRAYSCALE) Img plt. imshow(img, cmap •bicubic • ) • gray • , interpolation plt.yticks([]) # to hide tick values on X and Y axis linewidth=5) plt. plt. show( )](/uploads/projects/wsbo@ekqhd3/4a942426462ec795ca351865a5e82d4d.jpeg)








下面,我们可以开始绘制,这样:

![1 5 pts # OpenCV documentation # find this necessary, *pts • pts. np.int32) had this code, which reshapes the array to a 1 x 2 but you may; 1,2)) . 1 did cv2.p01y1inesCimg, [pts], True, 3)](/uploads/projects/wsbo@ekqhd3/f9926e5a8f3651127d88b5dab7d2bd27.jpeg)

![2 4 6 7 8 9 11 12 13 14 15 import numpy as np import cv2 img imread( •watch. jpg • , cv2. IMREAD_COLOR) cv2. line(img, (e, 0), (2øø, 3øe) , (255,255, 255) ,5e) cv2. img, (50e , 250), aøøe , see) , (O,ø, 255) ,15) cv2.circ1e(img, (447,63), 63, -1) pts pts = polylines(img, [pts], True, (8,255, 255), 3) font = cv2.FONT HERSHEY SIMPLEX np. int32) cv2.putText(img, 'OpenCV ruts! font, 6, 13, cv2. imshow( • image' , img) cv2. waitKey(e) cv2. destroyA11WindowsO cv2. LINE_AA)](/uploads/projects/wsbo@ekqhd3/8a5d6213b697c9714a54bd6e4069f79b.jpeg)
在下一个教程中,我们将介绍我们可以执行的基本图像操作。
四、图像操作
在 OpenCV 教程中,我们将介绍一些我们可以做的简单图像操作。 每个视频分解成帧。 然后每一帧,就像一个图像,分解成存储在行和列中的,帧/图片中的像素。 每个像素都有一个坐标位置,每个像素都由颜色值组成。 让我们列举访问不同的位的一些例子。
我们将像往常一样读取图像(如果可以,请使用自己的图像,但这里是我在这里使用的图像)![import cv2 import numpy as np img = cv2.imread( 'watch . jpg' ,cv2. INREAD COLOR) PX = img[SS,SS] print(px) , ROI , : print(px)](/uploads/projects/wsbo@ekqhd3/4c885e03f05e48d841bc8bb9d8338dc1.jpeg)


首先,让我们看看简单的加法会做什么:
255 ) 这 是 因 为 颜 色 是 0 一 255 , 其 中 255 : 2e5 , 381 , 27g 4 《 奂 冫 〈 2e5 , 2 接 下 来 , 我 们 可 以 添 加 图 像 , 并 可 以 假 设 每 个 图 像 都 有 不 同 的 “ 权 重 “ 。 这 是 如 何 工 作 的 .” class=”align-none”>

![1 2 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 23 24 25 26 27 import import # Load img1 img2 cv2 numpy as np two images cv2. imread( 3D-Matplotlib. png ) cv2. imread( ' mainlogo. png' ) # I want to put logo on top-left corner, rows, cols, channels = img2. shape roi = img1[Ø: rows, 0: cols ] So I create a ROI # Now create a mask of logo and create its inverse mask img2gray = cv2. cvtC010r(img2, cv2. COLOR BGR2GRAY) # add a threshold on. threshold(img2gray, 220, 255, cv2.THRESH BINARY INV) ret, mask cv2. bitwise_not(mask) mask inv # Now black-out the area of logo in ROI = mask_inv) imgl_bg = cv2. bitwise # Take only region of logo from logo image. img2_fg = cv2. img2,mask = mask) dst = cv2. img2_fg) 0: cols ] — dst](/uploads/projects/wsbo@ekqhd3/b54e9bdd862f32b36b22d2a6d4222ec9.jpeg)






更简单,但是我们仍然在这里忽略了很多背景。 接下来,我们可以尝试自适应阈值,这将尝试改变阈值,并希望弄清楚弯曲的页面。
还有另一个版本的阈值,可以使用,叫做大津阈值。 它在这里并不能很好发挥作用,但是:

![2 4 7 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import cv2 import numpy as np cap = cv2.VideoCapture(Ø) 6 v while(l)• cap. read() frame cv2.cvtC010r(frame, cv2.COLOR BGR2HSV) hsv lower_red = np. 5B\]) upper_red = cv2.inRange(hsv, lower_red, upper_red) mask cv2. mask= mask) cv2. imshow( frame' ,frame) cv2. imshow( mask ,mask) cv2. imshow( res , res) k = cv2.waitKey(5) & ØxFF if k 27: break cv2. destroyA11Windows ( ) . release() cap](/uploads/projects/wsbo@ekqhd3/5107d47d983932926ccef4b5309f6217.jpeg)
<br /><br />八、模糊和平滑<br />
在这个 Python OpenCV 教程中,我们将介绍如何尝试从我们的过滤器中消除噪声,例如简单的阈值,或者甚至我们以前的特定的颜色过滤器:<br />正如你所看到的,我们有很多黑点,其中我们喜欢红色,还有很多其他的色点散落在其中。 我们可以使用各种模糊和平滑技术来尝试弥补这一点。 我们可以从一些熟悉的代码开始:<br />![1 2 3 4 7 8 9 10 11 12 13 14 15 import cv2 import numpy as np cap = cv2. VideoCapture(Ø) while(l) = cap. read() frame cv2. cvtC010r(frame, cv2.COLOR BGR2HSV) hsv lower_red = np. 5B\] ) upper_red = np. cv2. inRange(hsv, lower_red, upper_red) mask cv2. mask= mask)](/uploads/projects/wsbo@ekqhd3/d75fca857d31bbc7856ec5b70ed6eec7.jpeg)



![1 import cv2 2 import numpy as np cv2. VideoC apture (0) cap 6 v while(l) 7 cap. read() 8 frame = cv2. cvtC010r(frame, cv2.COLOR BGR2HSV) 9 hsv 10 lower_red = 50\]) 11 12 upper_red = 13 mask = cv2. inRange(hsv, lower_red, upper_red) 14 cv2. mask= mask) 15 16 np uint8) 17 kernel cv2. erode (mask , kernel , iterations 18 erosion cv2. dilate(mask, kernel, iterations = 1) 19 dilation 20 cv2. imshow( Original , frame) 21 cv2. imshow( •Mask' ,mask) 22 cv2. imshow( • Erosion • , erosion) 23 cv2. imshow( ' Dilation ,dilation) 24 25 k = cv2.waitKey(5) & øxFF 26 27 if k 27:](/uploads/projects/wsbo@ekqhd3/98497fcd6892d2d28914458ebc3742de.jpeg)

下一对是“开放”和“关闭”。 开放的目标是消除“假阳性”。 有时在背景中,你会得到一些像素“噪音”。 “关闭”的想法是消除假阴性。 基本上就是你检测了你的形状,例如我们的帽子,但物体仍然有一些黑色像素。 关闭将尝试清除它们。![cv2. VideoCapture(1) 1 cap 2 3 v while(l) . 4 cap. read() frame cv2.cvtC010r(frame, cv2.COLOR 8GR2HSV) 6 hsv 7 lower_red = 50\]) 8 9 upper_red = np. 10 cv2. inRange(hsv, lower_red, upper_red) 11 mask res = cv2. mask= mask) 12 13 14 np. ones uint8) kernel 15 opening = cv2. morphologyEx(mask, cv2. MORPH OPEN, kernel) 16 closing = cv2.morph010gyEx(mask, cv2.MORPH CLOSE, kernel) 17 18 cv2. imshow( Original Frame) 19 cv2. imshow( 'Mask' ,mask) cv2. imshow( Opening' ,opening) cv2. imshow( Closing' , closing) 22 23 k = cv2.waitKey(5) & øxFF 24 25 if k 27: 26 break 27](/uploads/projects/wsbo@ekqhd3/9ece34ad717b3d3e842bacdf6b8cf039.jpeg)


在下一个教程中,我们将讨论图像渐变和边缘检测。
十、边缘检测和渐变
欢迎阅读另一个 Python OpenCV 教程。 在本教程中,我们将介绍图像渐变和边缘检测。 图像渐变可以用来测量方向的强度,边缘检测就像它所说的:它找到了边缘! 我敢打赌你肯定没看到。
首先,我们来展示一些渐变的例子:![1 import cv2 2 import numpy as np 3 cv2. VideoCapture(1) 4 cap — 6 v while(l). 7 8 # Take each frame cap. read() 9 frame cv2.cvtC010r(frame, cv2.COLOR BGR2HSV) 10 hsv 11 lower red = np. 50\]) 12 13 upper_red = 14 cv2. inRange(hsv, lower_red, upper_red) 15 mask cv2. mask= mask) 16 17 cv2. 64F) 18 laplacian sobelx = cv2. Sobel(frame, cv2.CV ksize=5) 19 sobely = cv2. Sobel(frame, cv2.CV ksize=5) 21 imshow( 'Original , frame 22 cv2. . imshow( 'Mask' ,mask) 23 cv2 . imshow( laplacian , laplacian) 24 cv2 imshow( ' sobelx' , sobelx) 25 cv2. . imshow( sobely• , sobely) 26 cv2 27](/uploads/projects/wsbo@ekqhd3/c2c3db898c51191dddc507e78890d9a0.jpeg)


这真是太棒了! 但是,这并不完美。 注意阴影导致了边缘被检测到。 其中最明显的是蓝狗窝发出的阴影。
在下一个 OpenCV 教程中,我们将讨论如何在其他图像中搜索和查找相同的图像模板。
这只是其中一个端口,但我们很好奇,看看我们是否可以匹配任何其他端口。 我们确实要选择一个阈值,其中某种东西可能是 80% 匹配,那么我们说这就匹配。 所以,我们将开始加载和转换图像:![1 2 3 4 5 6 7 8 import cv2 import numpy as np cv2. imread ( opencv -template-matching-python-tutorial. j pg • ) img_rgb img_gray = cv2. cv2. COLOR 8GR2GRAY) cv2. imread( opencv-template-for-matching. jpg template w, h = template. shape[: : -1]](/uploads/projects/wsbo@ekqhd3/2994edc7bc84f62561458d727ec18de3.jpeg)
到目前为止,我们加载了两个图像,转换为灰度。 我们保留原始的 RGB 图像,并创建一个灰度版本。 我之前提到过这个,但是我们这样做的原因是,我们在灰度版本上执行所有的处理,然后在彩色图像上使用相同的标签来标记。
对于主要图像,我们只有彩色版本和灰度版本。 我们加载模板并记下尺寸。
<br />所以我们得到了几个匹配。也许需要降低阈值?我们试试 0.7。<br /><br />十二、GrabCut 前景提取<br />
欢迎阅读 Python OpenCV 前景提取教程。 这里的想法是找到前景,并删除背景。 这很像绿屏,只是这里我们实际上不需要绿屏。<br />
首先,我们将使用一个图像:<br />
随意使用你自己的。<br />
让我们加载图像并定义一些东西:<br />![1 2 4 6 7 8 9 11 import numpy as np import cv2 from matplotlib import pyplot as plt img = cv2. imread( opencv-python-foreground-extraction -tutorial. jpg' ) np. zeros (img. shape[ : 2] , np. uint8) mask np. zeros( (1, 65) , np. float64) bgdMode1 np. zeros ( (1, 65) float64) fgdMode1 rect = (161,](/uploads/projects/wsbo@ekqhd3/4a942321b9997306021a9e0f0d826805.jpeg)

![1 2 6 7 cv2. rect, INIT WITH RECT) np. where( (mask==2) I (mask==Ø) 1) . astype( uint8 ) mask2 , np. newaxis \] Img — plt. imshow(img) plt. colorbar() plt. show()](/uploads/projects/wsbo@ekqhd3/2252564adb3db990105fefe3561c12e7.jpeg)
下个教程中,我们打算讨论如何执行角点检测。
十三、角点检测
欢迎阅读 Python OpenCV 角点检测教程。 检测角点的目的是追踪运动,做 3D 建模,识别物体,形状和角色等。
对于本教程,我们将使用以下图像:

十四、特征匹配(单映射)爆破
欢迎阅读 Python OpenCV 特征匹配教程。 特征匹配将是稍微更令人印象深刻的模板匹配版本,其中需要一个完美的,或非常接近完美的匹配。
我们从我们希望找到的图像开始,然后我们可以在另一幅图像中搜索这个图像。 这里的完美是图像不需要相同的光照,角度,旋转等。 特征只需要匹配。
首先,我们需要一些示例图像。 我们的“模板”,或者我们将要尝试匹配的图像:


十五、MOG 背景减弱
在这个 Python OpenCV 教程中,我们将要讨论如何通过检测运动来减弱图像的背景。 这将要求我们回顾视频的使用,或者有两个图像,一个没有你想要追踪的人物/物体,另一个拥有人物/物体。 如果你希望,你可以使用你的摄像头,或者使用如下的视频:
这里的代码实际上很简单,就是我们现在知道的:



在这里,我们找到了面部,它们的大小,绘制矩形,并注意 ROI。 接下来,我们找了一些眼睛:
完整代码:![1 2 4 6 7 8 9 10 11 12 13 v 14 15 16 17 18 V 19 20 21 22 23 24 import numpy as np import cv2 # multiple cascades: https://github.com/ltseez/opencv/tree/master/data/ haarcascades #https://github.com/ltseez/opencv/blob/master/data/haarcascades/ haarcascade frontalface default.xml face_cascade — cv2. CascadeC1assifier( #https://github.com/ltseez/opencv/blob/master/data/haarcascades/ haarcascade_eye. xm1 eye_cascade — cv2. CascadeC1assifier( 'haarcascade_eye.xml • ) cap = cv2.VideoCapture(Ø) while 1: ret, img = cap. read() gray cv2. cvtC010r(img, cv2. COLOR_3GR2GRAY) faces • face_cascade. detectMu1tiSca1e(gray, 1.3, 5) for in faces: cv2. rectangle(img, (x,y) , (x+w,y+h) , (255 0) , 2) x:x+w\] roi_gray — x: x+w\] roi color _cascade. eyes eye for in eyes:](/uploads/projects/wsbo@ekqhd3/3cc179ecfc55ea8e1cefe3283167dade.jpeg)

<br /><br /><br /><br /><br /><br /><br /><br /><br />![1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 def match False for file_type in ['neg•]: for img in for ugly in os.listdir( •uglies•): try: — / '+str(img) ugly = cv2. imread( •uglies/'+str(ugly)) question — cv2. imread if ugly. shape question. shape and not(np. ugly, question) . any ( ) ) print( • That is one ugly pic! Deleting! • ) print(current_image_path) os. remove (current_image_path) except Exception as e:](/uploads/projects/wsbo@ekqhd3/fa46e5d1fb4e1726fbefd655e1fad008.jpeg)



![def 5 7 8 9 11 12 13 c reate_pos _n_n eg ( ) for file_type in [ •neg']: for img in . if file_type pos line = file_type+'/ '+img+' 1 ØØ 5B 5Ø\n• with open('info.dat•, 'a • ) as f: f. write(line) elif file_type neg•• line = with as f: f. write(line)](/uploads/projects/wsbo@ekqhd3/0a829a6bcb1561ef58501960bdc9d718.jpeg)


opencv_createsamples -img watch5050.jpg -bg bg.txt -info info/info.lst -pngoutput info -maxxangle 0.5 -maxyangle 0.5 -maxzangle 0.5 -num 1950

现在让我们运行训练命令:
opencv_traincascade -data data -vec positives.vec -bg bg.txt -numPos 1800 -numNeg 900 -numStages 10 -w 20 -h 20
在这里,我们表明了,我们想要数据去的地方,矢量文件的位置,背景文件的位置,要使用多少个正片图像和底片图像,多少个阶段以及宽度和高度。请注意,我们使用的 numPos比我们少得多。这是为了给阶段腾出空间。


![28 29 30 31 32 33 34 35 36 37 38 39 40 roi_gray = gray[y:y+h, x: x+w] roi_color = x:x+w] eye_c a s c a de. detect-Mu ItiSc ale ( roi_gray ) eyes for in eyes: cv2. (ex, ey) , (ex+ew, ey+eh) , (0, 255 , 0) , 2) cv2. imshow( img• , img) k = cv2.waitKey(3Ø) & Øxff if k 27: break . release ( ) cap destroyA11Windows ( ) cv2.](/uploads/projects/wsbo@ekqhd3/e8036aeb9c2a4d0331641b7cf8d0777d.jpeg)

很酷! 所以你可能没有使用我的手表,你是怎么做的? 如果遇到麻烦,请尝试使用与我完全相同的所有内容。 检测图像,而不是检测摄像头,这里是一个:
谢谢阅读!!!

本文仅代表作者观点,不代表百度立场。本文系作者授权百家号发表,未经许可,不得转载。
已使用 Microsoft OneNote 2016 创建。
