《openCV超详细入门教程(python版).docx》由会员分享,可在线阅读,更多相关《openCV超详细入门教程(python版).docx(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、openCV超详细门教程(python版)涉及内容:背景提取颜过滤边缘检测于对象识别的特征匹配般对象识别你将需要两个主要的库,第三个可选:python-OpenCV,Numpy和Matplotlib。、加载图先,我们正在导些东西,我已经安装了这三个模块。接下来,我们将img定义为cv2.read(imagefile,parms)。默认值是IMREAD_COLOR,这是没有任何alpha通道的颜。如果你不熟悉,alpha是不透明度(与透明度相反)。如果你需要保留Alpha通道,也可以使IMREAD_UNCHANGED。很多时候,你会读取颜版本,然后将其转换为灰度。如果你没有络摄像机,这将是你在本
2、教程中使用的主要方法,即加载图像。你可以不使用IMREAD_COLOR等,而是使用简单的数字。你应该熟悉这两种选择,以便了解某个人在做什么。对于第二个参数,可以使用-1,0或1。颜色为1,灰度为0,不变为-1。因此,对于灰度,可以执行cv2.imread(watchjpg,0)。一旦加载完成,我们使用cv2.imshow(title,image)来显示图像。从这里,我们使用cv2.waitKey(0)来等待,直到有任何按键被按下。一旦完成,我们使用cv2.destroyAllWindows()来关闭所有的东西。二、加载视频源在这个PythonOpenCV教程中,我们将介绍一些使用视频和摄像头的
3、基本操作。除了起始行,处理来自视频的帧与处理图像是一样的。我们来举例说明一下:importnumpyasnpimportcv2cap=cv2.VideoCapture(0)从计算机上的第一个网络摄像头返回视频whileTrue:ret,frame=cap.read()其中r讨是布尔值,如果读取帧是正确的则返回Tue,如果文件读取到结尾,它的返回值就FFaise。fram就是每一帧的图像,是个三维矩阵。gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)cv2.imshow(frame,gray)ifcv2.waitKey(0)&0xFF=ord(q):brea
4、kcap.release()cv2.destroyAllWindows()首先,我们导入numpy和cv2,没有什么特别的。接下来,我们可以cap=cv2.VideoCapture(0)。这将从你计算机上的第一个网络摄像头返回视频。如果你正在观看视频教程,你将看到我正在使用1,因为我的第一个摄像头正在录制我,第二个摄像头用于实际的教程源。while(True):ret,frame=cap.read()这段代码启动了一个无限循环(稍后将被break语句打破),其中ret和frame被定义为cap.read()。基本上,ret是一个代表是否有返回的布尔值,frame是每个返回的帧。如果没有帧,你不
5、会得到错误,你会得到None。gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)在这,我们定义个新的变量gray,作为转换为灰度的帧。注意这个BGR2GRAY。需要注意的是,OpenCV将颜读取为BGR(蓝绿红),但多数计算机应程序读取为RGB(红绿蓝)。记住这点。cv2.imshow(frame,gray)请注意,尽管是视频流,我们仍然使imshow。在这,我们展了转换为灰的源。如果你想同时显,你可以对原始帧和灰度执imshow,将出现两个窗。ifcv2.waitKey(1)&0xFF=ord(q):break这个语句每帧只运次。基本上,如果我们得到个按键
6、,那个键是q,我们将退出while循环,然后运:cap.release()cv2.destroyAllWindows()这将释放络摄像头,然后关闭所有的imshow()窗。在某些情况下,你可能实际上需要录制,并将录制内容保存到新文件中。以下是在Windows上执行此操作的示例:importcv2cap=cv2.VideoCapture(0)fourcc=cv2.VideoWriter_fourcc(*XVID)out=cv2.VideoWriter(output.avi,fourcc,20.0,(640,480)whileTrue:ret,frame=cap.read()gray=cv2.cv
7、tColor(frame,cv2.COLOR_BGR2GRAY)out.write(frame)cv2.imshow(frame,gray)ifcv2.waitKey(1)&0xFF=ord(q):breakcap.release()out.release()cv2.destroyAllWindows()这里主要要注意的是正在使用的编解码器,以及在while循环之前定义的输出信息。然后,在while循环中,我们使用out.write()来输出帧。最后,在while循环之外,在我们释放摄像头之后,我们也释放out。太好了,现在我们知道如何操作图像和视频。如果你没有网络摄像头,你可以使用图像甚至视
8、频来跟随教程的其余部分。如果你希望使用视频而不是网络摄像头作为源,则可以为视频指定文件路径,而不是摄像头号码。现在我们可以使用来源了,让我们来展示如何绘制东西。此前你已经看到,你可以使用Matplotlib在图片顶部绘制,但是Matplotlib并不真正用于此目的,特别是不能用于视频源。幸运的是,OpenCV提供了一些很棒的工具,来帮助我们实时绘制和标记我们的源,这就是我们将在下一个教程中讨论的内容。三、在图像上绘制和写字在这个PythonOpenCV教程中,我们将介绍如何在图像和视频上绘制各种形状。想要以某种方式标记检测到的对象是相当普遍的,所以我们人类可以很容易地看到我们的程序是否按照我们
9、的希望工作。一个例子就是之前显示的图像之一:鼓励你使用自己的图片。像往常一样,我们的起始代码可以是这样的:importnumpyasnpimportcv2img=cv2.imread(watch.jpg,cv2.IMREAD_COLOR)下面,我们可以开始绘制,这样:cv2.line(img,(0,0),(150,150),(255,255,255),15)cv2.imshow(image,img)cv2.waitKey(0)cv2.destroyAllWindows()cv2.line()接受以下参数:图片,开始坐标,结束坐标,颜色(bgr),线条粗细。结果在这里:好吧,很酷,让我们绘制更多
10、形状。接下来是一个矩形:cv2.rectangle(img,(15,25),(200,150),(0,0,255),15)这里的参数是图像,左上角坐标,右下角坐标,颜色和线条粗细。圆怎么样?cv2.circle(img,(100,63),55,(0,255,0),-1)这里的参数是图像/帧,圆心,半径,颜色和。注意我们粗细为-1。这意味着将填充对象,所以我们会得到一个圆。线条,矩形和圆都很酷,但是如果我们想要五边形,八边形或十八边形?没问题!首先,我们将坐标数组称为pts(点的简称)。然后,我们使用cv2.polylines来画线。参数如下:绘制的对象,坐标,我们应该连接终止的和起始点,颜色和
11、粗细。importnumpyasnpimportcv2img=cv2.imread(sources/2.jpg,cv2.IMREAD_COLOR)pts=np.array(10,5,200,300,200,400,100,400,50,10,np.int32)pts=pts.reshape(-1,1,2)cv2.polylines(img,pts,True,(0,255,255),5)cv2.imshow(img,img)cv2.waitKey(0)cv2.destroyAllWindows()你可能想要做的最后一件事是在图像上写字。这可以这样做:importnumpyasnpimportcv
12、2img=cv2.imread(sources/2.jpg,cv2.IMREAD_COLOR)font=cv2.FONT_HERSHEY_SIMPLEXcv2.putText(img,OpenCVTuts!,(10,400),font,2,(200,255,155),5,cv2.LINE_AA)参数依次为图片,文字,文字起始位置font,文字大小,文字颜色,文字粗细,cv2.LINE_AAcv2.imshow(image,img)cv2.waitKey(0)cv2.destroyAllWindows()在下一个教程中,我们将介绍我们可以执行的基本图像操作。四、图像操作在OpenCV教程中,我们
13、将介绍一些我们可以做的简单图像操作。每个视频分解成帧。然后每一帧,就像一个图像,分解成存储在行和列中的,帧/图片中的像素。每个像素都有一个坐标位置,每个像素都由颜色值组成。让我们列举访问不同的位的一些例子。我们将像往常一样读取图像(如果可以,请使用自己的图像,但这里是我在这里使用的图像):importcv2importnumpyasnpimg二cv2.imread(watchjpg,cv2MREAD_COLOR)现在我们可以实际引用特定像素,像这样:px二img55,55下面我们可以实际修改像素:img55,55=255,255,255之后重新引用:px二img55,55print(px)现在
14、应该不同了,下面我们可以引用ROI,图像区域:px=img100:150,100:150print(px)我们也可以修改ROI,像这样:img100:150,100:150=255,255,255我们可以引我们的图像的特定特征:print(img.shape)print(img.size)print(img.dtype)我们可以像这样执操作:watch_face=img37:111,107:194#y1:y2,x1:x2x为纵向,y为横向img0:74,0:87=watch_facecv2.imshow(image,img)cv2.waitKey(0)cv2.destroyAllWindows
15、()这会处理我的图像,但是可能不能于你的图像,取决于尺。这是我的输出:这些是些简单的操作。在下个教程中,我们将介绍些我们可以执的更级的图像操作。五、图像算术和逻辑运算为欢迎来到另个PythonOpenCV教程,在本教程中,我们将介绍些简单算术运算,我们可以在图像上执的,并解释它们的作。和此,我们将需要两个相同的图像来开始,然后是个较的图像和个较的图像。先,我将使:先,让我们看看简单的加法会做什么:importcv2importnumpyasnp#500x250img1=cv2.imread(3D-Matplotlib.png)img2=cv2.imread(mainsvmimage.png)a
16、dd=img1+img2cv2.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)。接下来,我们可以添加图像,并可以假设每个图像都有不同的“权重”。这是如何作的:importcv2imp
17、ortnumpyasnpimg1=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法,参数是第个图像,权重,第个图像,权重,然后是伽马值,这是个光的测量值。我们现在就把它保留为零。这些是一些额外的选择,但如果你真的想将一个图像添加到另一个,最新的重叠在哪里?在这种情况下,你会
18、从最大的开始,然后添加较小的图像。为此,我们将使用相同的小黑图像,但使用一个新的Python标志:现在,我们可以选取这个标志,并把它放在原始图像上。这很容易(基本上使用我们在前一个教程中使用的相同代码,我们用一个新的东西替换了图像区域(ROI),但是如果我们只想要标志部分而不是白色背景呢?我们可以使用与之前用于ROI替换相同的原理,但是我们需要一种方法来“去除”标志的背景,使得白色不会不必要地阻挡更多背景图像。首先我将显示完整的代码,然后解释:importcv2importnumpyasnp#Loadtwoimagesimg1=cv2.imread(sources/1.jpg)img2=cv2
19、.imread(sources/3.jpg)# Iwanttoputlogoontop-leftcorner,SoIcreateaROIrows,cols,channels=img2.shaperoi=img10:rows,0:cols# Nowcreateamaskoflogoandcreateitsinversemaskimg2gray=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)# addathresholdret,mask=cv2.threshold(img2gray,220,255,cv2.THRESH_BINARY_IN)mask_inv=cv2.bi
20、twise_not(mask)# Nowblack-outtheareaoflogoinROIimg1_bg=cv2.bitwise_and(roi,roi,mask=mask_inv)# Takeonlyregionoflogofromlogoimage.img2_fg=cv2.bitwise_and(img2,img2,mask=mask)dst=cv2.add(img1_bg,img2_fg)img10:rows,0:cols=dstcv2.imshow(res,img1)v2.waitKey(0)我们将在下一个教程中介绍更多的阈值,所以请继续关注具体内容,但基本上它的工作方式是根据阈值
21、将所有像素转换为黑色或白色。在我们的例子中,阈值是220,但是我们可以使用其他值,或者甚至动态地选择一个,这是ret变量可以使用的值。接下来,我们看到:mask_inv=cv2.bitwise_not(mask)。这是一个按位操作。基本上,这些操作符与Python中的典型操作符非常相似,除了一点,但我们不会在这里触及它。在这种情况下,不可见的部分是黑色的地方。然后,我们可以说,我们想在第一个图像中将这个区域遮住,然后将空白区域替换为图像2的内容。下个教程中,我们深入讨论阈值。六、阈值欢迎阅读另一个OpenCV教程。在本教程中,我们将介绍图像和视频分析的阈值。阈值的思想是进一步简化视觉数据的分析
22、。首先,你可以转换为灰度,但是你必须考虑灰度仍然有至少255个值。阈值可以做的事情,在最基本的层面上,是基于阈值将所有东西都转换成白色或黑色。比方说,我们希望阈值为125(最大为255),那么125以下的所有内容都将被转换为0或黑色,而高于125的所有内容都将被转换为255或白色。如果你像平常一样转换成灰度,你会变成白色和黑色。如果你不转换灰度,你会得到二值化的图片,但会有颜色。虽然这听起来不错,但通常不是。我们将在这里介绍多个示例和不同类型的阈值来说明这一点。我们将使用下面的图片作为我们的示例图片,但可以随意使用你自己的图片:这个书的图片就是个很好的例子,说明为什么一个人可能需要阈值。首先,
23、背景根本没有白色,一切都是暗淡的,而且一切都是变化的。有些部分很容易阅读,另一部分则非常暗,需要相当多的注意力才能识别出来。首先,我们尝试一个简单的阈值:retval,threshold=cv2.threshold(img,10,255,cv2.THRESH_BINARY)二元阈值是个简单的“是或不是”的阈值,其中像素为255或0。在很多情况下,这是白色或黑色,但我们已经为我们的图像保留了颜色,所以它仍然是彩色的。这里的第一个参数是图像。下一个参数是阈值,我们选择10。下一个是最大值,我们选择为255。最后是阈值类型,我们选择了THRESH_BINARY。通常情况下,10的阈值会有点差。我们选
24、择10,因为这是低光照的图片,所以我们选择低的数字。通常125-150左右的东西可能效果最好。importcv2importnumpyasnpimg=cv2.imread(bookpage.jpg)retval,threshold=cv2.threshold(img,12,255,cv2.THRESH_BINARY)cv2.imshow(original,img)cv2.imshow(threshold,threshold)cv2.waitKey(0)cv2.destroyAllWindows()结果:现在的图片稍微更便于阅读了,但还是有点乱。从视觉上来说,这样比较好),但是仍然难以使用程序来
25、分析它。让我们看看我们是否可以进一步简化。先,让我们灰度化图像,然后使个阈值:importcv2importnumpyasnpimg=cv2.imread(sources/4.jpg)grayscaled=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)retval,threshold=cv2.threshold(grayscaled,10,255,cv2.THRESH_BINARY)cv2.imshow(original,img)cv2.imshow(threshold,threshold)cv2.waitKey(0).icmenithe工itkaiisserver,
26、.I:*ukei-【.send:-*nncviMNu.i*upthe汉“qbepo,defiuealately也thisca更简单,但是我们仍然在这忽略了很多背景。接下来,我们可以尝试适应阈值,这将尝试改变阈值,并希望弄清楚弯曲的页。importcv2importnumpyasnpimg=cv2.imread(sources/4.jpg)grayscaled=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)th=cv2.adaptiveThreshold(grayscaled,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_B
27、INARY,115,1)cv2.imshow(original,img)cv2.imshow(Adaptivethreshold,th)cv2.waitKey(0)cv2.destroyAllWindows()注3.TheMechanism哂wraptheiwtwoiling81HMyEementMactunlAma沁心IHyThesc5命wuecmtothepX*tieMiicadottserver,thenitwillcameeztotheportwe*laformabonhmaf;twosocketoptionsbycattingzp.yw_“u&Nextwe忆晚;i&eggMKkeuf
28、ulilAM6到receiveUHi*EX*?0rtgSSMv还有另个版本的阈值,可以使,叫做津阈值。它在这并不能很好发挥作retval2,threshold2=cv2.threshold(grayscaled,125,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)cv2.imshow(original,img)cv2.imshow(Otsuthreshold,threshold2)cv2.waitKey(0)cv2.destroyAllWindows()七、颜过滤在这个PythonOpenCV教程中,我们将介绍如何创建个过滤器,回顾按位操作,其中我们将过滤特定的
29、颜,试图显它。或者,你也可以专门筛选出特定的颜色,然后将其替换为场景,就像我们用其他方法替换ROI(图像区域)一样,就像绿屏的工作方式。为了像这样过滤,你有几个选项。通常,你可能会将你的颜色转换为HSV,即“色调饱和度纯度”。例如,这可以帮助你根据色调和饱和度范围,使用变化的值确定一个更具体的颜色。如果你希望的话,你可以实际生成基于BGR值的过滤器,但是这会有点困难。如果你很难可视化HSV,不要感到失落,查看维基百科页面上的HSV,那里有一个非常有用的图形让你可视化它。我最好亲自描述颜色的色调饱和度和纯度。现在让我们开始:importcv2importnumpyasnpcap=cv2.Vide
30、oCapture(0)whileTrue:ret,frame=cap.read()hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)lower_red=np.array(78,43,46)upper_red=np.array(99,255,255)mask=cv2.inRange(hsv,lower_red,upper_red)res=cv2.bitwise_and(frame,frame,mask=mask)cv2.imshow(frame,frame)cv2.imshow(mask,mask)cv2.imshow(res,res)ifcv2.waitKey(
31、5)&0xFF=ord(q):breakcv2.destroyAllWindows()cap.release()这只是一个例子,以红色为目标。它的工作方式是,我们所看到的是我们范围内的任何东西,基本上是30-255,150-255和50-180。它用于红色,但可以随便尝试找到自己的颜色。HSV在这里效果最好的原因是,我们想要范围内的颜色,这里我们通常需要相似的颜色。很多时候,典型的红色仍然会有一些绿色和蓝色分量,所以我们必须允许一些绿色和蓝色,但是我们会想要几乎全红。这意味着我们会在这里获得所有颜色的低光混合。为了确定HSV的范围,我认为最好的方法就是试错。OpenCV内置了将BGR转换为HS
32、V的方法。如果你想挑选单一的颜色,那么BGR到HSV将会很好用。为了教学,下面是这个代码的一个例子:dark_red=np.uint8(12,22,121)dark_red二cv2.cvtColor(dark_red,cv2.COLOR_BGR2HSV)这里的结果是一个HSV值,与dark_red值相同。这很棒一但是,同样你遇到了颜色范围和HSV范围的基本问题。他们根本不同。你可能合理使用BGR范围,它们仍然可以工作,但是对于检测一种颜色”,则无法正常工作。回到主代码,然而,我们首先要把帧转换成HSV。那里没什么特别的。接下来,我们为红色指定一些HSV值。我们使用inRange函数,为我们的特
33、定范围创建掩码。这是真或假,黑色或白色。接下来,我们通过执行按位操作来“恢复”我们的红色。基本上,我们显示了frameandmask。掩码的白色部分是红色范围,被转换为纯白色,而其他一切都变成黑色。最后我们展示所有东西。我选择了显示原始真,掩码和最终结果,以便更好地了解发生的事情。在下一个教程中,我们将对这个主题做一些介绍。你可能看到了,我们在这里还是有一些“噪音”。东西有颗粒感,红色中的黑点很多,还有许多其他的小色点。我们可以做一些事情,试图通过模糊和平滑来缓解这个问题,接下来我们将讨论这个问题。八、模糊和平滑在这个PythonOpenCV教程中,我们将介绍如何尝试从我们的过滤器中消除噪声,
34、例如简单的阈值,或者甚我们以前的特定的颜过滤器:正如你所看到的,我们有很多点,其中我们喜欢红,还有很多其他的点散落在其中。我们可以使各种模糊和平滑技术来尝试弥补这点。我们可以从些熟悉的代码开始:importcv2importnumpyasnpcap=cv2.VideoCapture(0)while(1):ret,frame=cap.read()hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)lower_red=np.array(30,150,50)upper_red=np.array(255,255,180)mask=cv2.inRange(hsv,lower
35、_red,upper_red)res=cv2.bitwise_and(frame,frame,mask=mask)现在,让我们应个简单的平滑,我们计算每个像素块的均值。在我们的例中,我们使15x15正形,这意味着我们有225个总像素。kernel=np.ones(15,15),np.float32)/225smoothed=cv2.filter2D(res,-1,kernel)cv2.imshow(Original,frame)cv2.imshow(Averaging,smoothed)k=cv2.waitKey(5)&0xFFifk=27:breakcv2.destroyAllWindows
36、()cap.release()blur=cv2.GaussianBlur(res,(15,15),0)cv2.imshow(GaussianBlurring,blur)另个选项是中值模糊:?o9*最后个选项是双向模糊:bilateral=cv2.bilateralFilter(res,15,75,75)cv2.imshow(bilateralBlur,bilateral)median=cv2.medianBlur(res,15)cv2.imshow(MedianBlur,median)所有模糊的对:少在这种情况下,我可能会使中值模糊,但是不同的照明,不同的阈值/过滤器,以及其他不同的标和标可能
37、会决定你使其中个。在下一个教程中,我们将讨论形态变换。九、形态变换在这个PythonOpenCV教程中,我们将介绍形态变换。这些是一些简单操作,我们可以基于图像形状执行。我们要谈的第一对是腐蚀和膨胀。腐蚀是我们将“腐蚀”边缘。它的工作方式是使用滑块(核)。我们让滑块滑动,如果所有的像素是白色的,那么我们得到白色,否则是黑色。这可能有助于消除一些白色噪音。另一个版本是膨胀,它基本上是相反的:让滑块滑动,如果整个区域不是黑色的,就会转换成白色。这是一个例子:importcv2importnumpyasnpcap=cv2.VideoCapture(0)while(1):res,frame=cap.r
38、ead()hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)lower_red=np.array(30,150,50)upper_red=np.array(255,255,180)mask=cv2.inRange(hsv,lower_red,upper_red)res=cv2.bitwise_and(frame,frame,mask=mask)kernel=np.ones(5,5),np.uint8)erosion=cv2.erode(mask,kernel,iterations=1)dilation=cv2.dilate(mask,kernel,iterati
39、ons=1)cv2.imshow(Original,frame)cv2.imshow(Mask,mask)cv2.imshow(Erosion,erosion)cv2.imshow(Dilation,dilation)k=cv2.waitKey(5)&0xFFifk=27:breakcv2.destroyAllWindows()cap.release()结果:下一对是“开放”和“关闭”。开放的目标是消除“假阳性”。有时在背景中,你会得到一些像素“噪音”。“关闭”的想法是消除假阴性。基本上就是你检测了你的形状,例如我们的帽子,但物体仍然有一些黑色像素。关闭将尝试清除它们。cap=cv2.Vide
40、oCapture(1)while(1):res,frame=cap.read()hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)lower_red=np.array(30,150,50)upper_red=np.array(255,255,180)mask=cv2.inRange(hsv,lower_red,upper_red)res=cv2.bitwise_and(frame,frame,mask=mask)kernel=np.ones(5,5),np.uint8)opening=cv2.morphologyEx(mask,cv2.MORPH_OPEN,ke
41、rnel)closing=cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel)cv2.imshow(Original,frame)cv2.imshow(Mask,mask)cv2.imshow(Opening,opening)cv2.imshow(Closing,closing)k=cv2.waitKey(5)&0xFFifk=27:breakcv2.destroyAllWindows()cap.release()另外两个选项是tophat和blackhat,对我们的案例并不有:#ItisthedifferencebetweeninputimageandO
42、peningoftheimagecv2.imshow(Tophat,tophat)#Itisthedifferencebetweentheclosingoftheinputimageandinputimage.cv2.imshow(Blackhat,blackhat)在下个教程中,我们将讨论图像渐变和边缘检测。、边缘检测和渐变欢迎阅读另个PythonOpenCV教程。在本教程中,我们将介绍图像渐变和边缘检测。图像渐变可以来测量向的强度,边缘检测就像它所说的:它找到了边缘!我敢打赌你肯定没看到。先,我们来展些渐变的例:importcv2importnumpyasnpcap=cv2.VideoCa
43、pture(0)whileTrue:ret,frame=cap.read()hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)lower_red=np.array(30,150,50)upper_red=np.array(255,255,180)mask=cv2.inRange(hsv,lower_red,upper_red)res=cv2.bitwise_and(frame,frame,mask=mask)laplacian=cv2.Laplacian(frame,cv2.CV_64F)sobelx=cv2.Sobel(frame,cv2.CV_64F,1,0
44、,ksize=5)sobely=cv2.Sobel(frame,cv2.CV_64F,0,1,ksize=5)cv2.imshow(frame,frame)cv2.imshow(mask,mask)cv2.imshow(laplacian,laplacian)cv2.imshow(sobelx,sobelx)cv2.imshow(sobely,sobely)ifcv2.waitKey(5)&0xFF=ord(q):breakcv2.destroyAllWindows()cap.release()V陶懿,那就是数据类型。ksize是核。我们使5,所以每次查询55的渔区如果你想知道什么是cv2.C
45、V_64F虽然我们可以使这些渐变转换为纯边缘,但我们也可以使Canny边缘检测!importcv2importnumpyasnpcap=cv2.VideoCapture(0)whileTrue:_,frame=cap.read()hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)lower_red=np.array(30,150,50)upper_red=np.array(255,255,180)mask=cv2.inRange(hsv,lower_red,upper_red)res=cv2.bitwise_and(frame,frame,mask=mask)cv2.imshow(Original,frame)edges=cv2.Canny(frame,100,200)cv2.imshow(Edges,edges)k=cv2.waitKey(5)&0xFFifk=27:breakcv2.destroyAllWindows()cap.release()这真是太棒了!但是,这并不完美。注意阴影导致了边缘被检测到。其中最明显的是蓝狗窝发出的阴影。在下个OpenCV教程中
限制150内