原创博文地址:opencv学习笔记01
1,opencv能做什么,不能做什么
2,阅读代码,知道某种func后图片怎么样了
3,在图片相关机器学习算法预处理阶段,希望通过对图片的简单处理,达到提升训练效果的目的。
https://www.jianshu.com/p/35712839830
·打开图片,显示,保存图片
·这些函数:cv2.imread(), cv2.imshow(), cv2.imwrite()
cv2.waitKey()是一个键盘绑定函数。它的参数是毫秒数,这个函数会等待任意键盘事件指定的毫秒时间。如果你点了任意键,这个程序继续。如果传入0,它会一直等待按键。它也可以设置成检测指定键,比如如果a被按了
cv2.destroyAllWindows()销毁所有的我们创建的窗口,如果你想销毁指定的窗口,使用函数cv2.destroyWindow()你可以传指定窗口的名字作为参数。
如果你使用64位的机器,你需要把k = cv2.waitKey(0) 这行换成:
1 2 3 4 5 |
k = cv2.waitKey(0) & 0xFF # 图集 imgs = np.hstack([img,img2]) # 展示多个 cv.imshow("mutil_pic", imgs) |
https://www.jianshu.com/p/562a936512ae
cap = cv2.VideoCapture(0)
cap.isOpened()
可以使用cap.get(propId)来访问这个视频的一些属性,propId是从0到18 的一个数。每个数字代表了视频的一个属性。
比如,我可以通过cap.get(3)和cap.get(4)来获得这一帧的宽度和高度。它默认会返回640x480,但是我想把值修改成320x240.只需要用ret = cap.set(3, 320)和ret = cap.set(4, 240)
1 2 3 4 |
fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) out.write(frame) out.release() |
https://www.jianshu.com/p/b0adf093e15f
cv2.line(), cv2.circle(), cv2.rectangle(), cv2.ellipse(), cv2.putText()
这些函数里,你会发现一些通用的参数:
·img:你要画形状的图片
·color:形状的颜色。对于BGR,传一个元组进去,比如(255,0,0)是蓝色。 对于灰度图,传一个灰度值。
·thickness:线或者圆的粗细。如果传了-1给一个封闭图形比如圆,它会充满图形。默认的thickness = 1
·lineType: 线的类型,比如8-connected,反锯齿等。默认情况下是8-connected。cv2.LINE_AA是反锯齿,在曲线时很好看。
1 2 3 4 5 6 7 8 |
img = cv2.line(img,(0,0),(511,511),(255,0,0),5) img = cv2.rectangle(img,(384,0),(510,128),(0,255,0),3) img = cv2.circle(img,(447,63),63,(0,0,255),-1) img = cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1) pts = np.array([[10,5],[20,30],[70,20],[50,10]],np.int32) pts = pts.reshape((-1,1,2)) img = cv2.polylines(img,[pts],True,(0,255,255)) |
注意:
如果第三个参数是False,你会得到一个连接所有点的图形,而不是一个封闭图形。
cv2.polylines()可以被用来画多条线,值需要建一个包含所有线的列表,然后把它传给函数就行了。所有线都会被独立绘制。这比每条线都调用一次cv2.line()更快更好的方法。
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, ‘OpenCV’, (10,500), font, 4,(255,255,255), 2, cv2.CV_AA)
https://www.jianshu.com/p/e261346db440
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
cv2.setMouseCallback('image',draw_circle) def draw_circle(event, x, y, flags, param): global ix, iy, drawing, mode if event == cv2.EVENT_LBUTTONDOWN: drawing = True ix,iy = x,y elif event == cv2.EVENT_MOUSEMOVE: if drawing == True: if mode == True: cv2.rectangle(img, (ix, iy), (x, y),(0,255,0),-1) else: cv2.circle(img,(x,y),5,(0,0,255),-1) elif event == cv2.EVENT_LBUTTONUP: drawing = False if mode == True: cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) else: cv2.circle(img,(x,y),5,(0,0,255),-1) |
https://www.jianshu.com/p/80efbe3880dc
1 2 3 |
>>>b,g,r = cv2.split(img) >>>img=cv2.merge((b,g,r)) >>>b = img[:,:,0] |
假设你想把所有的红色像素变成0,你不用这么分割,你可以简单的使用Numpy索引,这样更快
1 |
>>>img[:,:,2]=0 |
cv2.split()是一个成本很高的操作(执行时间),所以只在必要的时候使用。Numpy索引要更有效率,能用就用。
https://www.jianshu.com/p/4c4b4e651989
OpenCV和Numpy相加是不同的。OpenCV相加是一个渗透运算,而Numpy的相加是模运算。
1 2 3 4 5 6 7 8 |
>>>x = np.uint8([250]) >>>y = np.uint8([10]) >>>printcv2.add(x,y) ? ? ? # 250+10 = 260 => 255 [[255]] >>>print x+y ? ? ? ?# 250+10 = 260 % 256 = 4 [4] cv2.addWeighted() |
【Python——opencv篇】 bitwise_and、bitwise_not等图像基本运算及掩膜:https://blog.csdn.net/Lily_9/article/details/83143120
1 2 3 4 5 6 |
# set blue thresh lower_yellow=np.array([11,43,46]) hsv = cv.cvtColor(cp, cv.COLOR_BGR2HSV) mask = cv.inRange(hsv, lower_yellow, upper_yellow) cv.imshow('Mask', mask) res = cv.bitwise_and(cp, cp, mask=mask) |
https://www.jianshu.com/p/205a7514641a
cv2.getTickCount 函数返回从一个参考时间(比如机器开机的时间)开始到这个函数被调用的时间之间的时钟循环数量。所以如果你在函数执行前调用一次,函数执行完调用一次,你就能得到函数执行用掉的时钟循环。
cv2.getTickFrequency函数返回时钟频率或者每秒钟的时钟循环数。所以要得到函数执行了多少秒
OpenCV的默认优化
很多OpenCV函数对SSE2, AVX等做了优化。当然也有未优化的代码。所以如果我们的系统支持这些特性,我们应该利用他们(基本上现在的主流处理器都支持)。在编译的时候是自动启用的。所以如果启用的话OpenCV执行的是优化的代码,你可以用cv2.useOptimized()来检查是否启用了,用cv2.setUseOptimized()来启用/禁用
Python标量运算时比Numpy标量运算要快的。所以对于包含1到两个元素的运算,Python标量要比Numpy数组要快。Numpy在数组尺寸有点大的时候占优势。
注意:
一般来说,OpenCV函数比Numpy函数要快,所以对于相同的运算,推荐优先使用OpenCV函数。但是,也有例外,特别是当Numpy操作views而不是复制的时候。
https://www.jianshu.com/p/65c1fbd8ae2a、
了解下列函数:cv2.cvtColor(), cv2.inRange()
变更色彩空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# define range of blue color in HSV lower_blue = np.array([110,50,50]) upper_blue = np.array([130,255,255]) # Threshold the HSV image to get only blue colors mask = cv2.inRange(hsv,lower_blue,upper_blue) # Bitwise-AND mask and original image res = cv2.bitwise_and(frame,frame,mask=mask) >>>green = np.uint8([[[0,255,0]]]) >>>hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV) >>>print hsv_green [[[ 60 255 255]]] |