- import cv2 as cv
-
- src = cv.imread("D:/kon.jpg")
- #给窗口起名字
- cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
- #展示窗口
- cv.imshow("input image",src)
- #等待输入窗口退出
- cv.waitKey(0)
- #销毁窗口
- cv.destroyAllWindows()
-
- print("hi python")
打开摄像头捕获
- import cv2
-
- cv2.namedWindow('video',cv2.WINDOW_NORMAL)
- cv2.resizeWindow('video',640,480)
- # 打开摄像头
- cap=cv2.VideoCapture(0)
- # 数字代表索引如果有外部设备也是用数字代替
- # 循环读取摄像头的每一帧
- while True:
- # ret作为标记 true表示读到了 false表示没有读到
- ret,frame=cap.read()
- # 根据ret做判断
- if not ret:
- break
- cv2.imshow('video',frame)
- key=cv2.waitKey(0)
- if key & 0xFF ==ord('q'):
- break
- cap.release()
- cv2.destroyAllWindows()
-
- import cv2
- # 用相机捕获并保存 保存到该文件同一目录下
- cap=cv2.VideoCapture(0)
- fourcc=cv2.VideoWriter_fourcc(*'mp4v')
- # 创建videowriter
- # 最后一个括号的参数是相机的分辨率
- vw=cv2.VideoWriter('output.mp4',fourcc,30,(640,480))
- while cap.isOpened():
- ret,frame=cap.read()
- if not ret:
- break
- # 写每一帧数据
- vw.write(frame)
- cv2.imshow('frame',frame)
- if cv2.waitKey(1)==ord('q'):
- break
- cap.release()
- vw.release()
- cv2.destroyAllWindows()
- import cv2
- import numpy as np
- # trackbar的使用
- # 创建窗口
- cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
- # 重新定义创建窗口的大小
- cv2.resizeWindow('trackbar',640,480)
- # 定义回调函数
- def callback(value):
- print(value)
- # 创建3个trackbar 像进度条一样的东西 可以拖动然后调节颜色
- cv2.createTrackbar('R','trackbar',0,255,callback)
- cv2.createTrackbar('G','trackbar',0,255,callback)
- cv2.createTrackbar('B','trackbar',0,255,callback)
- # 创建背景图片
- # 第一个参数要和窗口的大小一样
- img=np.zeros((480,640,3),np.uint8)
- while True:
- # 获取当前trackbar的值
- r=cv2.getTrackbarPos('R','trackbar')
- g = cv2.getTrackbarPos('G', 'trackbar')
- b = cv2.getTrackbarPos('B', 'trackbar')
- # 用获取到的三个值修改背景图片颜色
- img[:]=[b,g,r]
- # 要把图片在窗口中展示出来
- cv2.imshow('trackbar',img)
- key=cv2.waitKey(1)
- if key==ord('q'):
- break
- cv2.destroyAllWindows()
cv2.imshow('trackbar',img)必须在窗口中显示
- import cv2
-
- def callback(value):
- pass
-
- cv2.namedWindow('color',cv2.WINDOW_NORMAL)
- cv2.resizeWindow('color',640,480)
- # 读取照片opencv默认读进来的照片是BGR的彩色空间
- # 是jpg不是jpeg导致程序错误
- img=cv2.imread('E:\My_Code\python\kon.jpg')
- # 定义颜色空间转换列表
- color_spaces=[
- # 所有颜色转换空间都是以COLOR开头
- # 2=to 转换的意思 因为opencv默认是BGR所以BGR写在前面
- cv2.COLOR_BGR2RGBA,cv2.COLOR_BGR2BGRA,
- cv2.COLOR_BGR2GRAY,cv2.COLOR_BGR2HSV,
- cv2.COLOR_BGR2YUV,
- ]
- # 设置trackbar 类似于进度条 只不过这次进度条的内容是颜色转换空间
- cv2.createTrackbar('trackbar','color',0,4,callback)
- while True:
- # 获取trackbar的值
- index=cv2.getTrackbarPos('trackbar','color')
- # 进行颜色空间转换
- cvt_img=cv2.cvtColor(img,color_spaces[index])
- cv2.imshow('color',cvt_img)
- key=cv2.waitKey(10)
- if key==ord('q'):
- break
- cv2.destroyAllWindows()
- import cv2
- import numpy as np
- # 纯黑的一张照片
- img=np.zeros((200,200,3),np.uint8)
- # 分割通道
- # 因为图像是BGR分割出来就是3个所以需要3个参数接收
- b,g,r=cv2.split(img)
- # 修改一些颜色
- # 截取一部分让它为白色
- b[10:100,10:100]=255
- g[10:100,10:100]=255
- # 合并通道
- img2=cv2.merge((b,g,r))
- cv2.imshow('img',np.hstack((b,g)))
- # 两张图片横着拼在一起展示
- cv2.imshow('img2',np.hstack((img,img2)))
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # 创建纯黑的一张照片作为背景图来画图 画直线
- img=np.zeros((480,640,3),np.uint8)
- # line(img,pt2,pt2,color,thickness,lineType,shift)
- cv2.line(img,(10,20),(300,400),(0,0,255),5,4)
- cv2.imshow('draw',img)
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # 图片的加法运算
- # 读取2张图片
- img1=cv2.imread('./kon.jpg')
- img2=cv2.imread('./kon2.jpg')
- print(img1.shape)
- print(img2.shape)
- # 在做加法前需要把2张图片的形状变得完全一致比如维度之类的
- # 可以通过ndarray的切片方式取出完全一样的形状
- # 第一张图片更大,所以从第一张图片里切除第2张图片
- new_img1=img1[0:460,:736]
- # cv2.add 加法操作要求2个图片的长宽相同,通道数相同
- # add的规则就是2个图对应位置的元素相加,如果超过255,全部变成255
- new_img=cv2.add(new_img1,img2)
- cv2.imshow('new_img',new_img)
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # 图片的融合
- # 不是简单的加法。相当于拿图片做了线性运算。new_img=img1*w1+img2*w2+bias
- img1=cv2.imread('./kon.jpg')
- img2=cv2.imread('./kon2.jpg')
- print(img1.shape)
- print(img2.shape)
-
- new_img1=img1[0:460,:736]
- # cv2.add 加法操作要求2个图片的长宽相同,通道数相同
- # add的规则就是2个图对应位置的元素相加,如果超过255,全部变成255
- new_img=cv2.addWeighted(new_img1,0.3,img2,0.7,0)
- cv2.imshow('new_img',new_img)
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # 卷积操作
- # 不同的卷积核 会让卷积后的图片呈现不一样的效果
- img1=cv2.imread('./kon.jpg')
- img2=cv2.imread('./kon2.jpg')
- # kernel必须是float型
- # 该kernel是起虚化的作用
- kernel=np.ones((5,5),np.float32)/25
- # 尝试其他卷积核,突出轮廓
- kernel=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]])
- # 卷积操作 -1表示和之前图片的类型相同
- dst=cv2.filter2D(img2,-1,kernel)
- cv2.imshow('img',np.hstack((img2,dst)))
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # 方盒滤波(与创建kernel的实现效果是一样的)
- img1=cv2.imread('./kon.jpg')
- img2=cv2.imread('./kon2.jpg')
- # 不用手动创建卷积核,只需要告诉方盒滤波,卷积核的大小是多少
- dst=cv2.boxFilter(img2,-1,(5,5),normalize=True)
- cv2.imshow('img',np.hstack((img2,dst)))
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # 均值滤波(模糊图片)
- img1=cv2.imread('./kon.jpg')
- img2=cv2.imread('./kon2.jpg')
- # 均值滤波没有位深这个参数 把-1删掉
- dst=cv2.blur(img2,(5,5))
- cv2.imshow('img',np.hstack((img2,dst)))
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # 高斯滤波 卷积核里的数都符合高斯分布(常用的是用来去噪)
- img1=cv2.imread('./kon.jpg')
- img2=cv2.imread('./kon2.jpg')
-
- dst=cv2.GaussianBlur(img2,(5,5),sigmaX=100)
- cv2.imshow('img',np.hstack((img2,dst)))
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # 中值滤波 对椒盐类的去噪效果好 高斯滤波对这个效果不太好
- img1=cv2.imread('./img3.png')
- # 中值滤波
- dst=cv2.medianBlur(img1,5)
-
- cv2.imshow('img',np.hstack((img1,dst)))
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # sobel算子 边缘检测(边缘部分像素值跃迁)
- img1=cv2.imread('./img1.png')
- # 注意sobel算子要分别计算下xy的梯度
- # 计算x轴方向的梯度
- dx=cv2.Sobel(img1,-1,dx=1,dy=0,ksize=3)
- # 计算y轴方向的梯度
- dy=cv2.Sobel(img1,-1,dx=0,dy=1,ksize=3)
- # 使用sobel算子 别忘了把xy的梯度合并在一起
- dst=cv2.add(dx,dy)
- # 要展示2张图片的时候需要2个窗口 窗口要取不同的名字
- cv2.imshow('img',img1)
- cv2.imshow('dx',dst)
-
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # canny和边缘检测
- img1=cv2.imread('./kon2.jpg')
-
- # 后面2个参数是阈值 大于最大阈值的肯定是边缘 小于最小阈值的肯定不是边缘 处于中间的与边缘相连的也是边缘
- #dst=cv2.Canny(img1,100,200)
-
- # 阈值给的稍大绘制的边缘不够精细
- # 可以通过给小一点阈值 得到较为精细的边缘
- dst=cv2.Canny(img1,64,128)
- cv2.imshow('img',dst)
-
-
- cv2.waitKey(0)
- cv2.destoryAllWindows()
- import cv2
- import numpy as np
- # 全局二值化
- img1=cv2.imread('./kon2.jpg')
- # 把图片转换成灰度图再进行二值化 二值化像素只有2个值
- gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
- # 注意thrshold会返回2个值,一个是阈值,一个是二值化处理的图片
- thresh,dst=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
-
- cv2.imshow('img',dst)
-
-
- cv2.waitKey(0)
- cv2.destoryAllWindows()