opencv常用的函数

一、图像的加载与展示

1、创建窗口

cv2.namedWindow( , )  

有两个参数,第一个是窗口名字,第二个是窗口属性,比如:cv2.WINDOW_NORMAL

 

2、读取图片

cv2.imread( , )

有两个参数,第一个是图片路径,可以用单引号或双引号将其括起来,第二个参数是设置图片颜色,如果不写,则默认为有色图片。

返回值是一个mat

 

3、展示图片(即将图片与窗口绑定在一起)

cv2.imshow( , )

第一个参数是窗口名第二个参数是imread读出的结果,是一个mat

[ WARN:0@0.012] global /Users/runner/work/opencv-python/opencv-python/opencv/modules/imgcodecs/src/loadsave.cpp (239) findDecoder imread_('algorithm.jpg'): can't open/read file: check file path/integrity
Traceback (most recent call last):
  File "/Users/dns/Desktop/study/MYOPENCV/testopencv.py", line 5, in <module>
    cv2.imshow('orign',img)
cv2.error: OpenCV(4.6.0) /Users/runner/work/opencv-python/opencv-python/opencv/modules/highgui/src/window.cpp:967: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'
如果出现以下报错,可能是因为图片的后缀格式错误,或者没有这张图片

 

4、展示时间

waitKey( )

0则是一直加载,其他的里面是几就是加载几毫秒,然后关闭窗口。

 

5、关闭窗口

key = waitKey(0)

if(key == 'q'):  exit()

其实这样写有个bug,就是按任何键都会退出。

from configparser import Interpolation
import cv2

img = cv2.imread('algorithm_code.jpg')
new = cv2.resize(img, None, fx = 0.5, fy = 0.5, interpolation = cv2.INTER_AREA)


while True:

    cv2.imshow('origin', img)
    cv2.imshow('new', new)
    key = cv2.waitKey(0)

    if(key & 0xFF == ord('q')):
        break
    elif(key & 0xFF == ord('s')):
        cv2.imwrite("/Users/dns/Desktop/study/MYOPENCV/algorithm_code.bmp", img)

cv2.destroyAllWindows()
恰当的写法应该是这样的

 

6、销毁所有窗口

destroyAllWIndows()

 

二、图像的缩放

1、解释resize()函数中各参数

resize(src, dst, dsize, fx, fy, interpolation)

src :原图像

dst :是大小改变后的图像,对于C++来说,需要传递一个输出参数,但对于Python来说就不用了,而是需要通过等于号去赋值,赋值给目标图像。

dsize :是目标的尺寸

fx :x轴的缩放因子,比如:fx = 0.7的话,就是表示目标长度 = 原来长度 * 0.7

fy :y轴的缩放因子

   dsize和fx、fy是冲突的,两个任选一个即可,当然都写上去也没错。

   在resize中默认使用dsize,如果它为None,那么就使用fx、fy。

interpolation :插值算法,也就是当图像缩放的时候,用的缩放的算法

from configparser import Interpolation
import cv2

img = cv2.imread('algorithm_code.jpg')
new = cv2.resize(img, None, fx = 0.5, fy = 0.5, interpolation = cv2.INTER_AREA)


while True:

    cv2.imshow('origin', img)
    cv2.imshow('new', new)
    key = cv2.waitKey(0)

    if(key & 0xFF == ord('q')):
        break
    elif(key & 0xFF == ord('s')):
        cv2.imwrite("/Users/dns/Desktop/study/MYOPENCV/algorithm_code.bmp", img)

cv2.destroyAllWindows()
具体例子

 

2、缩放算法

INTER_NEAREST,邻近插值,速度快,效果差

INTER_LINEAR,双线性插值,只计算原图中的4个点,速度快,效果好,一般默认这个

INTER_CUBIC,三次插值,计算原图中16个点,更平滑,效果更好,用的时间会较长

INTER_AREA,效果最好,用时也是最长的

 

参考文章:https://blog.csdn.net/xidaoliang/article/details/86504720

 

三、保存图片

inwrite(name, img)

name是要保存的文件名,文件的格式可以跟原来不一样,比如原来图片的类型是.jpg,可以转成.png。

img是mat类型

 

四、图像旋转

4.1 rotate(img, rotateCode)

img表示要进行旋转的图像

rotateCode表示多少度顺逆时针旋转,比如:ROTATE_90_CLOCKWISE(顺时针旋转90度)、ROTATE_180(旋转180度,顺逆时针的结果都是一样的)、ROTATE_90_COUNTERCLOCKWISE(逆时针旋转90度,相当于顺时针旋转270度)

当然这个函数只能够固定旋转90的倍数,不能灵活旋转。

 

4.2 灵活旋转

 

import cv2 
import matplotlib.pyplot as plt
# 1 读取图像
img = cv2.imread('algorithm_code.jpg')
# 2 图像旋转
rows,cols = img.shape[:2]
# 2.1 生成旋转矩阵          旋转中心点坐标  角度 缩放比例
M1 = cv2.getRotationMatrix2D((cols/2,rows/2),30,1)
M2 = cv2.getRotationMatrix2D((cols/2,rows/2),-30,1)
# 2.2 进行旋转变换
dst1 =cv2.warpAffine(img,M1,(cols,rows))
dst2 =cv2.warpAffine(img,M2,(cols,rows))
# 3 图像展示
fig,axes=plt.subplots(nrows=1,ncols=3,figsize=(10,8),dpi=100)
axes[0].imshow(img[:,:,::-1])
axes[0].set_title("orign")
axes[1].imshow(dst1[:,:,::-1])
axes[1].set_title("new1")
axes[2].imshow(dst2[:,:,::-1])
axes[2].set_title("new2")
plt.show()
能够灵活旋转的具体例子

 

 

   dst是指要输出图像                        参考文章:https://blog.csdn.net/m0_51545690/article/details/123959995   

  • plt.subplots()是一个函数,返回一个包含figure和axes对象的元组。因此,使用fig,axes = plt.subplots()将元组分解为fig和axes两个变量。 

    nrows,ncols:有多少行子图,多少列子图

    figsize 是用来设置图像的大小的

    dpi是指像素,每英寸长度内的像素点数

    axes[0]表示第一个子图,以此类推             参考文章:https://blog.csdn.net/qq_39622065/article/details/82909421

  • img[: , : , : : -1]的理解

     用opencv(cv2)读取图片,是以BGR的形式来读取的。而最后我们要看到的图片和原来的图片一致,就需要将BGR转成RGB形式,

     所以需要执行 [:,:,::-1]后,让数组会左右翻折,也就是BRG转换成RGB。                  

     参考文章:https://blog.csdn.net/u014453898/article/details/93716118

 

五、图片的剪切

 

import cv2
img=cv2.imread('algorithm_code.jpg')
cat = img[50:60,45:55]  #截取矩阵的w:50~60,h:45~55
cv2.imshow('img',img)
cv2.imshow('cat',cat)
cv2.waitKey(0)

 

 

posted @ 2022-09-22 15:41  算法扫地僧  阅读(203)  评论(0编辑  收藏  举报