opencv学习整理--基础入门

参考书籍:opencv 4.1中文官方文档v1.1版.pdf
网站:http://www.woshicver.com/

书中一些参考学习:
Python快速指南- [一小部分Python]:http://swaroopch.com/notes/python/
基本的Numpy教程:http://wiki.scipy.org/Tentative_NumPy_Tutorial
numpy示例列表:http://wiki.scipy.org/Numpy_Example_List
OpenCV文档:http://docs.opencv.org/
OpenCV论坛:http://answers.opencv.org/questions/

读取和显示文件

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

# 读取和显示图像
imgpath = r'D:\dell\picture\lena.png'

# cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
# cv.IMREAD_GRAYSCALE:以灰度模式加载图像
# cv.IMREAD_UNCHANGED:加载图像,包括alpha通道
# 注意 除了这三个标志,你可以分别简单地传递整数1、0或-1。
img = cv.imread(imgpath,cv.IMREAD_GRAYSCALE) #0表示加载灰度图像

showWay = 1
#opencv显示图像
if showWay == 0:
    # 默认情况下,该标志为cv.WINDOW_AUTOSIZE,如果将标志指定为**cv.WINDOW_NORMAL**,则可以调整窗口大小
    cv.namedWindow('image',cv.WINDOW_NORMAL)
    cv.imshow('image',img)
    resKey = cv.waitKey(0) & 0xFF
    print('reskey:',resKey)
    if resKey == 27: # 等待ESC退出
        cv.destroyAllWindows()
    elif resKey == ord('s'): # 等待关键字,保存和退出
        cv.imwrite('lenagray.png',img) #写入图像
        cv.destroyAllWindows()
    ## 随便点某一个按键都会结束,不知道为啥
#Matplotlib显示图像
elif showWay == 1:
    #OpenCV加载的彩色图像处于BGR模式。但是Matplotlib以RGB模式显示。因此,如果使用OpenCV读取彩色图像,则Matplotlib中将无法正确显示彩色图像
    plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
    plt.xticks([]), plt.yticks([]) # 隐藏 x 轴和 y 轴上的刻度值
    plt.show()

Matplotlib绘图样式和功能:http://matplotlib.org/api/pyplot_api.html
当你尝试在OpenCV中加载彩色图像并将其显示在Matplotlib中时,存在一些问题。阅读此讨论:http://stackoverflow.com/a/15074748/1134940)并理解它。

绘制线段,矩形,圆,椭圆,多边形,文字

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

# 读取和显示图像
imgpath = r'D:\dell\picture\lena.png' 
img = cv.imread(imgpath)
imgSize = img.shape #获取图片高宽,此图为(578, 457) 
#图像左上角为(0,0)

# 绘制一条宽度为5的蓝色对角线,(255,0,0)为BGR
cv.line(img,(0,0),(50,50),(255,0,0),5)
# 绘制一个绿色的宽度为3的矩形
cv.rectangle(img,(0,0),(80,80),(0,255,0),3)
# 绘制一个圆,-1表示填充圆
cv.circle(img, (110,110), 20, (0,0,255), -1)
# 绘制椭圆,参数依次为中心位置,(长轴长度,短轴长度),沿逆时针方向旋转的角度,startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。
cv.ellipse(img,(250,400),(100,50),30,0,180,(0,255,255),-1)
# 绘制多边形
pts = np.array([[10,10],[100,20],[160,100],[20,80]], np.int32)
pts = pts.reshape((-1,1,2))
#如果第三个参数为False,您将获得一条连接所有点的折线,而不是闭合形状
cv.polylines(img,[pts],True,(255,0,255))
#像图像添加文本
font = cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV-Python',(100,420), font, 1,(0,0,0),2,cv.LINE_AA)

cv.imshow('image',img)
resKey = cv.waitKey(0)
cv.destroyAllWindows()

结果:
在这里插入图片描述

鼠标事件

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

drawing = False # 如果按下鼠标,则为真
mode = True # 如果为真,绘制矩形。按 m 键可以切换到曲线
ix,iy = -1,-1

# 鼠标回调函数
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy = x,y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing == True:
            if mode == True:
                cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                cv.circle(img,(x,y),3,(255,0,0),-1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode == True:
            cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv.circle(img,(x,y),10,(0,0,255),-1)

# 读取和显示图像
imgpath = r'D:\dell\picture\lena.png' 
img = cv.imread(imgpath)

cv.namedWindow('image')
#绑定鼠标回调事件
cv.setMouseCallback('image',draw_circle)

while(1):
    cv.imshow('image',img)
    resKey = cv.waitKey(20) & 0xFF
    if resKey == 27:
        break
    elif resKey == ord('m'):
        mode = not mode
cv.destroyAllWindows()

效果显示:
在这里插入图片描述

获取和修改图像像素,获取图像类型,ROI,图像通道拆分合并,图像融合


import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

cv.namedWindow('image')
imgpath = r'D:\dell\picture\lena.png' 
imgpath2 = r'D:\dell\picture\unknow.png' 
img = cv.imread(imgpath)
img2 = cv.imread(imgpath2)

#获取图像行,列和通道数的元组
print(img.shape) #返回 (578, 457, 3)
#访问图像像素
# pixelInfo = img[100,100]  #BGR [229 227 230]
pixelInfo = img.item(100,100,2)  #红色通道
print(pixelInfo)  
#修改像素
# img[100,100] = [0,0,0]
img.itemset((100,100,2),10)
#像素总数
print( img.size )  #792438  = 578*457*3
#图像数据类型
print( img.dtype ) #uint8
#获取图像感兴趣的ROI
partImg = img[50:350,10:400]
#将BGR图像拆分为单个通道
# b = img [:, :, 0]
b,g,r = cv.split(partImg)  #是一项耗时的操作
#合并rgb
mergeImg = cv.merge((b,g,r))
#显示ROI图像
# cv.imshow('image',partImg)
# resKey = cv.waitKey(0) & 0xFF
# cv.destroyAllWindows()

# 图像边框设置
# replicate = cv.copyMakeBorder(partImg,10,10,10,10,cv.BORDER_REPLICATE)
# reflect = cv.copyMakeBorder(partImg,10,10,10,10,cv.BORDER_REFLECT)
# reflect101 = cv.copyMakeBorder(partImg,10,10,10,10,cv.BORDER_REFLECT_101)
# wrap = cv.copyMakeBorder(partImg,10,10,10,10,cv.BORDER_WRAP)
# constant= cv.copyMakeBorder(mergeImg,10,10,10,10,cv.BORDER_CONSTANT,value=[255,0,0])
# # matplotlib显示时图像BGR变为RGB,这里没处理
# plt.subplot(231),plt.imshow(mergeImg,'gray'),plt.title('ORIGINAL')
# plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
# plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
# plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
# plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
# plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
# plt.show()

#图像融合
#计算图像操作耗时
e1 = cv.getTickCount()
dst = cv.addWeighted(img,0.7,img2,0.3,0)
e2 = cv.getTickCount()
t = (e2 - e1)/cv.getTickFrequency()
print( t )
# 检查是否启用了优化 ,  关闭它cv.setUseOptimized(False)
print(cv.useOptimized())

cv.imshow('image',dst)
resKey = cv.waitKey(0) & 0xFF
cv.destroyAllWindows()

效果:
在这里插入图片描述

图像缩放,平移,旋转,仿射变换,透视变换


import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt

imgpath = r'D:\dell\picture\lena.png' 
imgpath2 = r'D:\dell\picture\unknow.png' 
img = cv.imread(imgpath)
img2 = cv.imread(imgpath2)
#图像变换--**cv.warpAffine**采用2x3转换矩阵,而**cv.warpPerspective**采用3x3转换矩阵作为输入。
#图像缩放 -- 注意里面fx,fy为int类型
res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC)
#或者
height, width = img.shape[:2]
res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)

#平移
M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(width,height))

#旋转
# cols-1 和 rows-1 是坐标限制,参数依次为旋转中心,旋转角度,缩放系数
M = cv.getRotationMatrix2D(((width-1)/2.0,(height-1)/2.0),90,1)
dst = cv.warpAffine(img,M,(width,height))

# cv.namedWindow('image')
# cv.imshow('image',dst)
# resKey = cv.waitKey(0) & 0xFF
# cv.destroyAllWindows()

#仿射变换
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
dst = cv.warpAffine(img,M,(cols,rows))
# plt.subplot(121),plt.imshow(img),plt.title('Input')
# plt.subplot(122),plt.imshow(dst),plt.title('Output')
# plt.show()

#透视变换
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv.getPerspectiveTransform(pts1,pts2)
dst = cv.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力减肥的小胖子5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值