
正文
pythoncv2函数 cycle函数python
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
opencv-python中的cv2.namedWindow()有什么用?
opencv-python中的cv2.namedWindow(),其作用如下:
使用cv2.imshow()的时候,如果图片太大,会显示不全并且无法调整。
因此在cv2.imshow()的前面加上这样的一个语句:cv2.namedWindow('image', 0),得到的图像框就可以自行调整大小,可以拉伸进行自由调整。
扩展资料:
用法:cv2.namedWindow('窗口标题',默认参数)
默认参数:
cv2.WINDOW_AUTOSIZE+cv2.WINDOW_KEEPRATIO+cv2.WINDOW_GUI_EXPANDED)
参数:
(1)cv2.WINDOW_NORMAL:窗口大小可改变。
(2)cv2.WINDOW_AUTOSIZE:窗口大小不可改变。
(3)cv2.WINDOW_FREERATIO:自适应比例。
(4)cv2.WINDOW_KEEPRATIO:保持比例。
相关问答
Q1: 目标跟踪(5)使用 Opencv 和 Python 进行对象跟踪
在本教程中,我们将学习如何基于 Opencv 和 Python 实现对象跟踪。
首先必须明确目标检测和目标跟踪有什么区别:
我们将首先讨论对象检测,然后讨论如何将对象跟踪应用于检测。
可能有不同的应用,例如,计算某个区域有多少人,检查传送带上有多少物体通过,或者计算高速公路上的车辆。
当然,看过本教程后,您会很容易地想到数以千计的想法应用于现实生活或可能应用于工业。
在本教程中,我们将使用 3 个文件:
首先我们需要调用highway.mp4文件并创建一个mask:
正如您在示例代码中看到的,我们还使用了 createBackgroundSubtractorMOG2 函数,该函数返回背景比率(background ratio),然后创建mask。
mask可视化结果:
但是,如您所见,图像中有很多噪点。因此,让我们通过删除所有较小的元素来改进提取,并将我们的注意力集中在大于某个面积的对象上。
使用 OpenCV 的cv2.drawContours函数绘制轮廓,我们得到了这个结果。
就本教程而言,分析整个窗口并不重要。我们只对计算在某个点通过的所有车辆感兴趣,因此,我们必须定义一个感兴趣的区域 ROI 并仅在该区域应用mask。
结果可视化如下:
函数 cv2.createBackgroundSubtractorMOG2 是在开始时添加的,没有定义参数,现在让我们看看如何进一步改进我们的结果。history是第一个参数,在这种情况下,它设置为 100,因为相机是固定的。varThreshold改为 40,因为该值越低,误报的可能性就越大。在这种情况下,我们只对较大的对象感兴趣。
在继续处理矩形之前,我们对图像进行了进一步的清理。为此,阈值函数就派上用场了。从我们的mask开始,我们告诉它我们只想显示白色或黑色值,因此通过编写254, 255,只会考虑 254 和 255 之间的值。
然后我们将找到的对象的坐标插入到 if 条件中并绘制矩形
这是最终结果:
我们现在只需导入和集成跟踪功能。
一旦创建了对象,我们必须获取边界框的每个位置并将它们插入到单个数组中。
通过在屏幕上显示结果,您可以看到所有通过 ROI 的通道是如何被识别的,以及它们的位置是如何插入到特定的数组中的。显然,识别的摩托车越多,我们的数组就越大。
现在让我们将带有位置的数组传递给tracker.update()。我们将再次获得一个包含位置的数组,但此外,将为每个对象分配一个唯一的 ID。
从代码中可以看出,我们可以使用 for 循环分析所有内容。此时我们只需要绘制矩形并显示车辆 ID。
在图像中,您可以看到结果
main.py
从视频中也可以看到,我们已经获得了我们在本教程开始时设置的结果。
但是,您必须将其视为练习或起点,因为关于这个主题有很多话要说,而本教程的目的只是让您了解对象跟踪的原理。
如果你想将 Object Tracking 集成到你的项目中,你应该使用更可靠和先进的对象检测方法,以及跟踪方法。
完整代码地址:私信“333”直接获取或者「链接」
Q2: OpenCV-Python教程:22.轮廓层级
理论
在前面的关于轮廓的几节里,我们介绍了轮廓相关的一些函数。但当我们用cv2.findContours()函数来找轮廓的时候,我们传入了一个参数,Contour Retrieval Mode。我们一般传的是cv2.RETR_LIST或者cv2.RETR_TREE这样就可以了。但是这个参数实际是什么意思呢?
并且在输出时我们得到了三个数组,第一个是图像,第二个是我们的轮廓,第三个输出名字是hierarchy。但是我们一直没用这个。
什么是层级?
一般来说我们用cv2.findContours()函数来检测图像里的目标,有时候目标在不同的地方,但是在有些情况下,有些图形在别的图形里面,就像图形嵌套,在这种情况下,我们把外面那层图形叫做parent,里面的叫child。这样图形里的轮廓之间就有了关系。我们可以指定一个轮廓和其pythoncv2函数他之间的是如何连接的,这种关系就是层级。
看下面的例子pythoncv2函数:
在这个图像里,不同的图形我标注了0-5,2和2a表示了最外层盒子的外部和内部轮廓。
这里轮廓0,1,2是外部的。我们可以说他们是hierarchy-0,或者他们是同层级的。
接下来是contour-2a,可以认为是轮廓-2的孩子,或者反过来,contour-2是contour-2a的父亲,所以它在hierarchy-1里。类似的contour-3是contour-2的孩子,在下一层级。最后contour4,5是contour-3a的孩子,它们在最后的层级。
OpenCV里的层级表示
每个轮廓有他自己的关于层级的信息,谁是他的孩子,谁是他的父亲等。OpenCV用一个包含四个值得数组来表示:[Next, Previous, First_Child, Parent]
"Next表明同一层级的下一个轮廓"
比如,在我们的图片里的contour-0,水上hi他相同层级的下一个轮廓?是contour-1,所以Next=1,对于Contour-1,下一个是contour-2,所以Next=2
那对于contour-2呢?没有同层级的下一个轮廓,所以Next=-1。那么对于contour-4呢?同层级的下一个是contour-5,所以下一个轮廓是contour-5.Next=5
"Previous指同层级的前一个轮廓"
和上面一样,contour-1的前一个是contour-0.contour-2的前一个contour-1.对于contour-0没有前序,所以-1
"First_Child指它的第一个孩子轮廓"
不用解释,对于contour-2,孩子是contour-2a,所以这里是contour-2a的索引,contour-3a有两个孩子,但我们只取第一个,是contour-4,所以First_Child=4.
"Parent指它的父轮廓索引"
和First_Child相反,contour-4和contour-5的parent都是contour-3a,对于contour-3a,是contour-3
注意:
如果没有孩子或者父亲,就为-1
我们知道了层级,现在来看OpenCV里的轮廓获取模式,四个标志cv2.RETR_LIST, cv2.RETR_TREE, cv2.RETR_CCOMP, cv2.RETR_EXTERNAL表示啥?
轮廓获取模式
1.RETR_LIST
这是最简单的一个,它获取所有轮廓,但是不建立父子关系,他们都是一个层级。
所以,层级属性第三个和第四个字段(父子)都是-1,但是Next和Previous还是有对应值。
下面是结果,每行是对应轮廓的层级信息。
hierarchy
2.RETR_EXTERNAL
如果用这个模式,它返回最外层的。所有孩子轮廓都不要,我们可以说在这种情况下,只有家族里最老的会被照顾,其他都不管。
所以在我们的图像里,有多少最外层的轮廓呢,有3个,contours 0,1,2
3.RETR_CCOMP
这个模式获取所有轮廓并且把他们组织到一个2层结构里,对象的轮廓外边界在等级1里,轮廓内沿(如果有的话)放在层级2里。如果别的对象在它里面,里面的对象轮廓还是放在层级1里,它的内沿在层级2.
看下面的例子,轮廓的顺序为红色,他们的层级是绿色,
看第一个轮廓,contour-0,他的层级是1,他有两个洞,contours1和2,他们都属于层级2,所以对于contour-0,Next是contour-3,没有前序,他的第一个孩子是contour-1,没有parent,所以层级数组是[3,-1,1,-1]
看contour-1,他在层级2里,Next是contour-2,没有前序,没有孩子,parent是contour-0,所以数组是[2,-1,-1,0]
同样对于contour-2,也在层级2里,没有next,前序是contour-1,没有孩子,parent是contour-0,所以[-1,1,-1,0]。
contour-3:next是contour-5,Previous是contour-0,Child是contour-4,没有parent,所以[5,0,4,-1]
contour-4:在层级2里,没有兄弟,所以没有Next,没有Previous,没有孩子,parent是contour-3,[-1,-1,-1,3]
4.RETR_TREE
最后,Mr.Perfect。它取回所有的轮廓并且创建完整的家族层级列表,它甚至能告诉pythoncv2函数你谁是祖父,父亲,儿子,孙子。。
比如把上面的图形用cv2.RETR_TREE,
对于contour-0:层级是0,Next是contour-7,没有previous,孩子是contour-1,没有parent,所以[7,-1,1,-1]
contour-1:在层级1里,没有同级的其他轮廓,没有previous,孩子是contour-2,所以[-1,-1,2,0]
OpenCV里的直方图
Q3: 【python】opencv库中cv2.findContours()和cv2.drawContours()函数
一.查找轮廓
cv2.findContours()
[image,] contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
轮廓检索方式pythoncv2函数:
轮廓近似方法pythoncv2函数:
二.绘制轮廓
cv2.drawContours()
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
Q4: python用cv2怎么输出图像的基本信息
源码:
#!/usr/bin/env python
#coding=utf-8
__author__ = 'zhangdebin'
import cv2
if __name__ == '__main__':
#image read
image = cv2.imread("/Users/zhangdebin/Documents/checkFace2.jpg")
image0 = cv2.imread("/Users/zhangdebin/Documents/checkFace2.jpg",0)
image1 = cv2.imread("/Users/zhangdebin/Documents/checkFace2.jpg",1)
print image
cv2.namedWindow("the window")
cv2.imshow("the window", image)
cv2.namedWindow("the window0")
cv2.imshow("the window0", image0)
cv2.namedWindow("the window1")
cv2.imshow("the window1", image1)
cv2.waitKey(0)
其中,cv2是我在mac系统中安装的python-opencv包,具体安装方法在另一篇博文有介绍,
cv2.imread和matlab中的imread函数很像,其中源码有一个参数imread(…)
imread(filename[, flags]) - retval,falgs经测试,当缺省时为原图像,当falgs=0时,因为只读取第一个字节,彩色图像读取为灰度图像,当falgs逐渐增加,向7(0~7,8位)靠拢时,字节数增加,图像色彩越来越靠近原图像,当超过8位,比如8,变为(8-8=0),又是只取一个字节,视觉效果为灰度图,同理,15位为原图,有兴趣的朋友可以自己测试下,具体效果见下图:
同时,cv2中自带了falgs =cv2.CV_LOAD_IMAGE_GRAYSCALE或
cv2.CV_LOAD_IMAGE_COLOR,其实这两个参数和上面是一样的,0为grayimage,但是color=1,而且显示时候也不是彩色的,这和matlab的imread有很大区别
grayimage = cv2.imread('/Users/zhangdebin/Documents/checkoutFace2.jpeg',cv2.CV_LOAD_IMAGE_GRAYSCALE);
colorimage = cv2.imread('/Users/zhangdebin/Documents/checkoutFace2.jpeg', cv2.CV_LOAD_IMAGE_COLOR)
print 'cv2.grayscale:'
print cv2.CV_LOAD_IMAGE_GRAYSCALE
print 'colr:'
print cv2.CV_LOAD_IMAGE_COLOR
cv2.grayscale:
colr:
1
Q5: python前视图转换为俯视图
想要把前视图转化为鸟瞰图,有两种做法
1.在没有标定的情况下,只能选取四个点对了
在有标定的情况下,可以直接使用标定的参数
这里主要介绍1
1.没有标定的情况下,主要用到了两个函数
M = cv2.getPerspectiveTransform(src, dst)
warped = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0] + 1080))
cv2.getPerspectiveTransform 从四个点对中计算透视变换,返回值为3*3的透视变换矩阵
cv2.warpPerspective 计算透视变换后的图像
这里自己遇到的坑是,在计算透视变换矩阵的时候,怎么获取那四个点对,翻了很多blog,都没搞清,最后认认真真的找了一个认认真真的阅读之后,总算摸到门道了,有了一种融会贯通的感觉。
现在的目标是将图像由前视图转化为鸟瞰图,根据先验知识,在鸟瞰图下,长方形物体显示出来肯定是长方形,因此,我们只要在前视图中找到一个正方形的物体,并指定他在俯视图中的坐标就可以了,这里有个但是,由于先验信息里面只有矩形这个信息,具体的长宽比什么的,以及实际的大小未知,所以转化到鸟瞰图下并不能反应物体的真实长度。
这里怎么定义转化后的坐标要自己把握
790ec7dc8aa1
原图
比如说转化到黄色的坐标(内接矩形),这时候就会内缩,图像出现黑边
790ec7dc8aa1
转化到黄色坐标
如果转化到蓝色的,那么能看到的方位就很小了,只有当前车道了(外接矩形)
790ec7dc8aa1
转化到蓝色坐标
dst的坐标也可以自己写,想要转成多大的图像也可以自己填
比如说根据车道的宽度和虚线的长度,可以大概估算出实际长宽比,一个车道宽度为3.75米 这种城市道路一般虚线是两米,间隔4米(高速一般是69,也就是15米)大概估计一下,高度是12米,也就是说长宽比为12:7,想要显示出4个车道,图像的宽度为1920,折算了一下,目标图像的坐标大概是(这里要注意,图像的坐标是从左上角开始算的)
790ec7dc8aa1
自定义
坐标定义代码:
src = np.float32([(1242,1949),(1961,1949), (2695, 2542), (133, 2542)])
#内接矩形
dst = np.float32([(1242, 1949), (1961, 1949), (1961, 2542), (1242, 2542)])
#外接矩形
dst = np.float32([(132, 1949), (2695, 1949), (2695, 2542), (133, 2542)])
#自定义
dst = np.float32([(480,1560-1080), (1440,1560-1080), (1440,3096-1080), (480,3096-1080)])
2.使用标定参数来转化
这个转化就是真实的了,因为知道相机的内参,还有相机的pitch角以及相机距离地面的高度
matlab里面转的,要标定的参数
可以参考的透视变换
pythoncv2函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于cycle函数python、pythoncv2函数的信息别忘了在本站进行查找喔。








