我的学习笔记

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()
import cv2
import numpy as np
# 自适应阈值二值化
img1=cv2.imread('./kon2.jpg')
# 把图片转换成灰度图再进行二值化 二值化像素只有2个值
gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)

# 自适应阈值二值化只有一个返回值
dst=cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,19,0)

cv2.imshow('img',dst)


cv2.waitKey(0)
cv2.destoryAllWindows()
import cv2
import numpy as np
# 腐蚀操作 用自己定义的卷积核(全为1)去扫描 卷积核中既有白的又有黑的最终为黑的 只有全部为白的时候才为白的
img1=cv2.imread('./img2.png')
# 定义核
kernel=np.ones((5,5),np.uint8)
# iterations迭代次数(卷积核去扫几次)
dst=cv2.erode(img1,kernel,iterations=1)

cv2.imshow('imgs',dst)

cv2.waitKey(0)
cv2.destoryAllWindows()
import cv2
import numpy as np
# 获取形态学卷积核
# opencv提供了获取卷积核的api,不需要我们手工创建卷积核
img1=cv2.imread('./img2.png')
# 获取核
# shape指的是卷积核中1形成的形状
# getStructuringElement(shape,ksize[,anchor])
kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
# iterations迭代次数(卷积核去扫几次)
dst=cv2.erode(img1,kernel,iterations=2)

cv2.imshow('imgs',dst)

cv2.waitKey(0)
cv2.destoryAllWindows()
import cv2
import numpy as np
# 膨胀操作(与腐蚀操作是相反的,腐蚀可以理解为缩小,膨胀是放大)
# opencv提供了获取卷积核的api,不需要我们手工创建卷积核
img1=cv2.imread('./img2.png')

kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))

dst=cv2.dilate(img1,kernel,iterations=2)

cv2.imshow('imgs',dst)

cv2.waitKey(0)
cv2.destoryAllWindows()
import cv2
import numpy as np
# 膨胀操作与腐蚀操作的简单运用

img1=cv2.imread('./img2.png')

kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
# 先腐蚀再膨胀
dst=cv2.erode(img1,kernel,iterations=2)
dst1=cv2.dilate(dst,kernel,iterations=2)
cv2.imshow('imgs',dst1)

cv2.waitKey(0)
cv2.destoryAllWindows()
import cv2
import numpy as np
# 开运算=腐蚀+膨胀(因为是开所以是打开,所以最后一步是膨胀)

img1=cv2.imread('./img2.png')

kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
# 调用opencv的api
# MORPH_OPEN意思是开运算
dst1=cv2.morphologyEx(img1,cv2.MORPH_OPEN,kernel,iterations=2)
cv2.imshow('imgs',dst1)

cv2.waitKey(0)
cv2.destoryAllWindows()
import cv2
import numpy as np
# 形态学梯度=原图-腐蚀 留下的就是边缘

img1=cv2.imread('./img2.png')

kernel=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
# 调用opencv的api

dst1=cv2.morphologyEx(img1,cv2.MORPH_GRADIENT,kernel,iterations=2)
cv2.imshow('imgs',dst1)

cv2.waitKey(0)
cv2.destoryAllWindows()

顶帽操作=原图-开运算 留下外部的噪声

黑帽操作=原图-闭运算 留下内部的噪声

import cv2
import numpy as np
# 查找轮并绘制轮廓
# 图像显示是黑白的,但实际上是3个通道的彩色图像
img1=cv2.imread('./img4.jpg')
# 先变成单通道的灰白图像
gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
# 二值化,返回2个值,一个阈值,一个二值化后的图像
thresh,binary=cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
# 查找轮廓 返回2个结果分别是轮廓和层级
contours,hierarchy=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#  绘制轮廓会修改原图 如果想保持原图不变,copy一份
img_copy=img1.copy()
img2=cv2.drawContours(img_copy,contours,-1,(0,0,255),2)

cv2.imshow('imgs',img2)

cv2.waitKey(0)
cv2.destoryAllWindows()
import cv2
import numpy as np
# 查找轮并绘制轮廓
# 图像显示是黑白的,但实际上是3个通道的彩色图像
img1=cv2.imread('./img4.jpg')
# 先变成单通道的灰白图像
gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
# 二值化,返回2个值,一个阈值,一个二值化后的图像
thresh,binary=cv2.threshold(gray,150,255,cv2.THRESH_BINARY)
# 查找轮廓 返回2个结果分别是轮廓和层级
contours,hierarchy=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#  绘制轮廓会修改原图 如果想保持原图不变,copy一份
img_copy=img1.copy()
img2=cv2.drawContours(img_copy,contours,-1,(0,0,255),5)
# 使用多边形逼近模拟轮廓
approx=cv2.approxPolyDP(contours[-1],5,closed=True)
#  画出多边形逼近的轮廓
img3=cv2.drawContours(img2,[approx],0,(0,255,0),2)
cv2.imshow('imgs',img3)

cv2.waitKey(0)
cv2.destoryAllWindows()

高斯金字塔向上(把偶数行和偶数列去掉)向下可以把图片变大变下

import cv2
import numpy as np
# 画直方图要导入另一个包
import matplotlib.pyplot as plt
# 使用opencv统计直方图
# 直方图就是x轴为灰度级 y轴为该灰度级出现的次数或者概率
img1=cv2.imread('./kon2.jpg')
hist=cv2.calcHist([img1],[0],None,[256],[0,255])
# 并画出直方图
plt.plot(hist,color='b',label='blue')
plt.show()
# cv2.waitKey(0)
# cv2.destoryAllWindows()
import cv2
import numpy as np
# import matplotlib.pyplot as plt

img1=cv2.imread('./kon2.jpg')
# 变成黑白图片
gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
# 生成掩膜图像(想要显示的为白色区域,不想显示的黑色区域)
mask=np.zeros(gray.shape,np.uint8)
# 设置想要统计直方图的区域
mask[200:400,200:400]=255
# mask与原图做与运算
# gray和gray做与运算结果还是gray,mask的作用就是gray和gray先做与运算,结果再和mask做与运算
cv2.imshow('mask_gray',cv2.bitwise_and(gray,gray,mask=mask))
cv2.waitKey(0)
cv2.destoryAllWindows()

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值