• Opencv基础运用


     二、基础运用

    1、读取图像

    使用cv.imread()函数读取图像。图像应该在工作目录或图像的完整路径应给出。

     参数:

    第一个参数是图像路径。

    第二个参数是一个标志,它指定了读取图像的方式。

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

    import numpy as np
    import cv2 as cv
    
    #加载彩色灰度图像
    img = cv.imread('test.jpg',0)

    警告:即使图像路径错误,它也不会引发任何错误,但是print img会给出None。

    2、显示图像

    使用函数cv.imshow()在窗口中显示图像。窗口自动适合图像尺寸。

    第一个参数是窗口名称,它是一个字符串。第二个参数是我们的对象。你可以根据需要创建任意多个窗口,但可以使用不同的窗口名称。

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

    cv.waitKey()是一个键盘绑定函数。其参数是以毫秒为单位的时间。该函数等待任何键盘事件指定的毫秒。如果您在这段时间内按下任何键,程序将继续运行。如果0被传递,它将无限期地等待一次敲击键。它也可以设置为检测特定的按键,例如,如果按下键 a 等。

    注意:除了键盘绑定事件外,此功能还处理许多其他GUI事件,因此你必须使用它来实际显示图像。
    cv.destroyAllWindows()只会破坏我们创建的所有窗口。如果要销毁任何特定的窗口,请使用函数 cv.destroyWindow()在其中传递确切的窗口名称作为参数。

    注意:
    在特殊情况下,你可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,你可以指定窗口是否可调整大小。这是通过功能cv.namedWindow()完成的。默认情况下,该标志为cv.WINDOW_AUTOSIZE。但是,如果将标志指定为cv.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸过大以及向窗口添加跟踪栏时,这将很有帮助。

    cv.namedWindow('image',cv.WINDOW_NORMAL)
    cv.imshow('image',img)
    cv.waitKey(0)
    cv.destroyAllWindows()

    3、写入图像

    使用函数cv.imwrite()保存图像。第一个参数是文件名,第二个参数是要保存的图像。

    cv.imwrite('messigray.png',img)
    #这会将图像以PNG格式保存在工作目录中。

    小结

    在下面的程序中,以灰度加载图像,显示图像,按s保存图像并退出,或者按ESC键直接退出而不保存。

    import numpy as np
    import cv2 as cv
    img = cv.imread('messi5.jpg',0)
    cv.imshow('image',img)
    k = cv.waitKey(0)
    if k == 27:         # 等待ESC退出
        cv.destroyAllWindows()
    elif k == ord('s'): # 等待关键字,保存和退出
        cv.imwrite('messigray.png',img)
        cv.destroyAllWindows()

    警告:如果使用的是64位计算机,则必须k = cv.waitKey(0)按如下所示修改行:k = cv.waitKey(0) & 0xFF

    4、访问图像

    (1)访问图像像素值

    先加载彩色图像

    >>> import numpy as np
    >>> import cv2 as cv
    >>> img = cv.imread('test.jpg')

    你可以通过行和列坐标来访问像素值。对于 BGR 图像,它返回一个由蓝色、绿色和红色值组成的数组。对于灰度图像,只返回相应的灰度。

    >>> px = img[100,100]
    >>> print( px )
    [157 166 200]
    # 仅访问蓝色像素
    >>> blue = img[100,100,0]
    >>> print( blue )
    157

    你可以用相同的方式修改像素值。

    >>> img[100,100] = [255,255,255]
    >>> print( img[100,100] )
    [255 255 255]

    警告: Numpy是用于快速数组计算的优化库。因此,简单地访问每个像素值并对其进行修改将非常缓慢,因此不建议使用。

    注意:
    上面的方法通常用于选择数组的区域,例如前5行和后3列。对于单个像素访问,Numpy数组方法array.item()和array.itemset())被认为更好,但是它们始终返回标量。如果要访问所有B,G,R值,则需要分别调用所有的array.item()。

    更好的像素访问和编辑方法:

    # 访问 RED 值
    >>> img.item(10,10,2)
    59
    # 修改 RED 值
    >>> img.itemset((10,10,2),100)
    >>> img.item(10,10,2)
    100

    (2)访问图像属性

    图像属性包括行数,列数和通道数,图像数据类型,像素数等。图像的形状可通过img.shape访问。它返回行,列和通道数的元组(如果图像是彩色的):

    >>> print( img.shape )
    (342, 548, 3)

    注意: 如果图像是灰度的,则返回的元组仅包含行数和列数,因此这是检查加载的图像是灰度还是彩色的好方法。
    像素总数可通过访问img.size

    >>> print( img.size )
    562248

    图像数据类型通过img.dtype获得:

    图像数据类型通过img.dtype获得:

    注意: img.dtype在调试时非常重要,因为OpenCV-Python代码中的大量错误是由无效的数据类型引起的。

    (3)设置感兴趣区域(ROI)

    有时候,你不得不处理一些特定区域的图像。对于图像中的眼睛检测,首先对整个图像进行人脸检测。在获取人脸图像时,我们只选择人脸区域,搜索其中的眼睛,而不是搜索整个图像。它提高了准确性(因为眼睛总是在面部上:D )和性能(因为我们搜索的区域很小)。使用Numpy索引再次获得ROI。在这里,我要选择球并将其复制到图像中的另一个区域:

    >>> ball = img[280:340, 330:390]
    >>> img[273:333, 100:160] = ball 

    5、改变图像大小

    6、绘画图像

    主要有以下几种绘画方式

    例如:cv.line()cv.circle()cv.rectangle()cv.ellipse()cv.putText()等。

    后面将看到一些常见的参数,如下所示:

    • img:您要绘制形状的图像
    • color:形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)对于蓝色。对于灰度,只需传递标量值即可。
    • 厚度:线或圆等的粗细。如果对闭合图形(如圆)传递-1 ,它将填充形状。默认厚度= 1
    • lineType:线的类型,是否为8连接线,抗锯齿线等。默认情况下,为8连接线。cv.LINE_AA给出了抗锯齿的线条,看起来非常适合曲线。

    (1)画线

    要绘制一条线,您需要传递线的开始和结束坐标。我们将创建一个黑色图像,并从左上角到右下角在其上绘制一条蓝线。

    import numpy as np
    import cv2 as cv
    # 创建黑色的图像
    img = np.zeros((512,512,3), np.uint8)
    # 绘制一条厚度为5的蓝色对角线
    cv.line(img,(0,0),(511,511),(255,0,0),5)

    (2)画矩形

    要绘制矩形,您需要矩形的左上角和右下角。这次,我们将在图像的右上角绘制一个绿色矩形。

    cv.rectangle(img,(384,0),(510,128),(0,255,0),3)

    (3)画圆圈

    要绘制一个圆,需要其中心坐标和半径。我们将在上面绘制的矩形内绘制一个圆。

    cv.circle(img,(447,63), 63, (0,0,255), -1)

    (4)画椭圆

    要绘制椭圆,我们需要传递几个参数。一个参数是中心位置(x,y)。下一个参数是轴长度(长轴长度,短轴长度)。angle是椭圆沿逆时针方向旋转的角度。startAngle和endAngle表示从主轴沿顺时针方向测量的椭圆弧的开始和结束。即给出0和360给出完整的椭圆。有关更多详细信息,请参阅cv.ellipse的文档。下面的示例在图像的中心绘制一个椭圆形。

    cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

    (5)画多边形

     要绘制多边形,首先需要顶点的坐标。将这些点组成形状为ROWSx1x2的数组,其中ROWS是顶点数,并且其类型应为int32。在这里,我们绘制了一个带有四个顶点的黄色小多边形。

    pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
    pts = pts.reshape((-1,1,2))
    cv.polylines(img,[pts],True,(0,255,255))

    注意:
    如果第三个参数为False,您将获得一条连接所有点的折线,而不是闭合形状。
    cv.polylines()可用于绘制多条线。只需创建要绘制的所有线条的列表,然后将其传递给函数即可。所有线条将单独绘制。与为每条线调用cv.line相比,绘制一组线是一种更好,更快的方法。

     (6)向图像添加文本

     要将文本放入图像中,需要指定以下内容。

    • 您要写入的文字数据
    • 您要放置它的位置坐标(即数据开始的左下角)。
    • 字体类型(检查cv.putText文档以获取受支持的字体)
    • 字体比例(指定字体大小)
    • 常规的内容,例如颜色,厚度,线条类型等。为了获得更好的外观,建议使用lineType = cv.LINE_AA

    我们将在白色图像上写入OpenCV

    font = cv.FONT_HERSHEY_SIMPLEX
    cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
  • 相关阅读:
    C#在WebApi 中使用Redis 的方法
    IList<> IEnumerable<> ReadOnlyCollection<> 使用方向
    winform DateTimePicker 设置成秒
    vs 在高分屏下开发 winform 配置
    eclipse spring插件
    request方法
    Nexus添加中央仓库
    eclipse 安装velocity插件
    java >> << .>>> 计算详解
    SheetJS 入门案例
  • 原文地址:https://www.cnblogs.com/windyrainy/p/15169559.html
Copyright © 2020-2023  润新知