opencv笔记1

openCV是什么?

它的全称是Open source Computer Vision Library,开放源代码计算机视觉库。

后面亚博小车有颜色识别并追踪、人脸识别并追踪实践项目。先了解下基础函数使用。

一 图像的读取与展示

1图像的读取

img = cv2.imread('yahboom.jpg', 0)

第一个参数是图片的路径,第二个参数是如何读取这幅图片。

cv2.IMREAD_UNCHANGED:保持原格式不变,-1;

cv2.IMREAD_GRAYSCALE:以灰度模式读入图片,可以用0表示;

cv2.IMREAD_COLOR:,读入一副彩色图片,可以用1表示;默认值

cv2.IMREAD_UNCHANGED:读入一幅图片,并包括其alpha通道,可以用2表示。

图像展示

**cv.imshow('frame', frame):**打开一个窗口名为frame,并且显示frame帧数据(图像/视频数据)

参数含义:

第一个参数表示创建打开的窗口的名字

第二个参数表示需要显示的图片

图像的写入

cv2.imwrite('new_img_name', img)

参数含义:

第一个参数是保存的文件名

第二个参数是保存的图像

python 复制代码
import cv2 as cv
import rclpy
from rclpy.node import Node
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径

class OpenCVNode(Node):
    def readImg(self,img_name: str):
        default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_name
        self.get_logger().info(f'打开图片:{default_image_path}')
        img = cv.imread(default_image_path)
        cv.imwrite("2_new.jpg",img)
        new_img = cv.imread('2_new.jpg')
        cv.imshow('frame',img)
        cv.imshow('new_frame',new_img)
        cv.waitKey(0)

def main():
    rclpy.init()
    node = OpenCVNode('opencvNode')
    node.readImg('2.jpg') 
    rclpy.spin(node)
    rclpy.shutdown()

效果:

2 修改图像颜色

先读取图像,然后修改bgr的数值,示例就是画条线

python 复制代码
import cv2 as cv
import rclpy
from rclpy.node import Node
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径

class OpenCVNode(Node):
    def readImg(self,img_name: str):
        default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_name
        self.get_logger().info(f'打开图片:{default_image_path}')
        img = cv.imread(default_image_path)
        (b,g,r) = img[100,100]
        print(b,g,r)
        i=0
        j=0
        for j in range(200,500):
            img[i,j] =(255,255,0)
            for j in range(200,500):
                img[i,j] = (255,255,0)
        cv.imshow('frame',img)
        cv.waitKey(0)

def main():
    rclpy.init()
    node = OpenCVNode('opencvNode')
    node.readImg('2.jpg') 
    rclpy.spin(node)
    rclpy.shutdown()

二 图片几何变化

图片缩放

cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)

参数含义:

InputArray src:输入图片

OutputArray ds:输出图片

Size:输出图片尺寸

fx,fy:沿x轴,y轴的缩放系数

interpolation:插入方式,可选择INTER_NEAREST(最近邻插值),INTER_LINEAR(双线性插值(默认设置)),INTER_AREA(使用像素区域关系进行重采样),INTER_CUBIC(4x4像素邻域的双三次插值),INTER_LANCZOS4(8x8像素邻域的Lanczos插值)

python 复制代码
import cv2
import rclpy
from rclpy.node import Node
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径

class OpenCVNode(Node):
    def readImg(self,img_name: str):
        default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_name
        self.get_logger().info(f'打开图片:{default_image_path}')
        img = cv2.imread(default_image_path)
        self.get_logger().info(f'image shape:{img.shape}')
        x,y = img.shape[0:2]
        img_test = cv2.resize(img,(int(x/2),int(y/2)))
        cv2.imshow('frame',img)
        cv2.imshow('resize',img_test)
        cv2.waitKey(0)

def main():
    rclpy.init()
    node = OpenCVNode('opencvNode')
    node.readImg('2.jpg') 
    rclpy.spin(node)
    rclpy.shutdown()

图片裁剪

首先读取图像,然后再数组中获取像素点区域。

python 复制代码
import cv2
import rclpy
from rclpy.node import Node
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径

class OpenCVNode(Node):
    def readImg(self,img_name: str):
        default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_name
        self.get_logger().info(f'打开图片:{default_image_path}')
        img = cv2.imread(default_image_path)
        self.get_logger().info(f'image shape:{img.shape}')
        cut = img[0:200,200:400]
        cv2.imshow('frame',img)
        cv2.imshow('cut',cut)
        cv2.waitKey(0)

def main():
    rclpy.init()
    node = OpenCVNode('opencvNode')
    node.readImg('2.jpg') 
    rclpy.spin(node)
    rclpy.shutdown()

图片仿射-平移

cv2.warpAffine 是 OpenCV 中用于执行仿射变换的函数。仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了图像的平直性和平行性。常见的仿射变换包括平移、旋转、缩放和剪切。

cv2.warpAffine(src, M, dsize[,dst[, flags[, borderMode[, borderValue]]]])

参数含义:

src - 输入图像。

M - 变换矩阵。

dsize - 输出图像的大小。

flags - 插值方法的组合(int 类型!)

borderMode - 边界像素模式(int 类型!)

borderValue - (重点!)边界填充值; 默认情况下,它为0。

上述参数中:M作为仿射变换矩阵,一般反映平移或旋转的关系,为InputArray类型的2×3的变换矩阵。从数学上看仿射变换是一种二维坐标(x,y)到二维坐标(u,v)之间的线性变换,比如:平移就是加上一个向量。

如果将原始图像src向右侧移动tx、向下移动ty个像素,则其对应关系为:

dst(x, y) = src(x+tx, y+ty)

将上述表达式补充完整,即:

dst(x, y) = src(1·x + 0·y + tx, 0·x + 1·y + ty)

得到转移矩阵:

[[1,0,tx],

[0,1,ty]]

代码如下:

python 复制代码
import cv2
import rclpy
from rclpy.node import Node
import numpy as np
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径

class OpenCVNode(Node):
    def readImg(self,img_name: str):
        default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_name
        self.get_logger().info(f'打开图片:{default_image_path}')
        img = cv2.imread(default_image_path)
        self.get_logger().info(f'image shape:{img.shape}')
        tx,ty = 20,50 #平移距离
        imgInfo = img.shape# 获取图片尺寸
        height = imgInfo[0]
        width = imgInfo[1]
        #创建平移矩阵:2*3
        matShift = np.float32([[1, 0, tx], [0, 1, ty]])
        #应用矩阵
        shift_img = cv2.warpAffine(img,matShift,(width,height))
        cv2.imshow('frame',img)
        cv2.imshow('shift img',shift_img)
        cv2.waitKey(0)

def main():
    rclpy.init()
    node = OpenCVNode('opencvNode')
    node.readImg('2.jpg') 
    rclpy.spin(node)
    rclpy.shutdown()

效果:

图片仿射

仿射变化需要一个转换矩阵,复杂的仿射变换需要使用OpenCV 提供的 cv2.getAffineTransform()函数来生成变换矩阵M,M=cv2.getAffineTransform(src, dst)src 和 dst 中的三个点分别对应平行四边形的左上角、右上角、左下角三个点。

这个理解起来比较抽象,我看了下也没太懂,参照例子试一下效果

python 复制代码
import cv2
import rclpy
from rclpy.node import Node
import numpy as np
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径

class OpenCVNode(Node):
    def readImg(self,img_name: str):
        default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_name
        self.get_logger().info(f'打开图片:{default_image_path}')
        img = cv2.imread(default_image_path)
        self.get_logger().info(f'image shape:{img.shape}')
        tx,ty = 20,50 #平移距离
        imgInfo = img.shape# 获取图片尺寸
        height = imgInfo[0]
        width = imgInfo[1]
        #选择3个点
        mat_src = np.float32([[0, 0],[0, height-1],[width-1, 0]])  
        mat_dst = np.float32([[0, 0],[100, height-100],[width-100, 100]]) 
        #创建平移矩阵:2*3
        matShift = cv2.getAffineTransform(mat_src, mat_dst)
        #应用矩阵
        shift_img = cv2.warpAffine(img,matShift,(width,height))
        cv2.imshow('frame',img)
        cv2.imshow('shift img',shift_img)
        cv2.waitKey(0)

def main():
    rclpy.init()
    node = OpenCVNode('opencvNode')
    node.readImg('2.jpg') 
    rclpy.spin(node)
    rclpy.shutdown()

效果如下:

镜像图片

cv2.flip() 函数的主要功能是实现对图像的翻转操作,可以在水平方向、垂直方向或者两者方向(即对角线翻转)上进行。

python 复制代码
import cv2
import rclpy
from rclpy.node import Node
import numpy as np
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径

class OpenCVNode(Node):
    def readImg(self,img_name: str):
        default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'+img_name
        self.get_logger().info(f'打开图片:{default_image_path}')
        img = cv2.imread(default_image_path)
        self.get_logger().info(f'image shape:{img.shape}')
  
        y = cv2.flip(img, 1) #水平翻转 y轴
        x = cv2.flip(img, 0) #垂直翻转 x轴
        xy = cv2.flip(img,-1) # xy
        #应用矩阵
        cv2.imshow('src',img)
        cv2.imshow('x 翻转',x)
        cv2.imshow('y 翻转',y)
        cv2.imshow('xy 翻转',xy)
        cv2.waitKey(0)

def main():
    rclpy.init()
    node = OpenCVNode('opencvNode')
    node.readImg('e.jpg') 
    rclpy.spin(node)
    rclpy.shutdown()

效果如下

相关推荐
XianxinMao4 分钟前
《多模态语言模型:一个开放探索的技术新领域》
人工智能·算法·语言模型
西猫雷婶4 分钟前
python学opencv|读取图像(三十七 )截断处理
人工智能·opencv·计算机视觉
m0_7482398310 分钟前
深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna)
人工智能·sql·开源
doubt。16 分钟前
【BUUCTF】[GXYCTF2019]BabySQli
网络·数据库·笔记·sql·mysql·安全·web安全
京东零售技术35 分钟前
2024 京东零售技术年度总结
大数据·人工智能
CV金科35 分钟前
基础科学——高等数学简洁笔记-第一章第一节(函数----上)
笔记·学习·考研·学习方法·高等数学·简洁
港股研究社36 分钟前
医药新零售的下半场,叮当健康找到增长搭子
大数据·人工智能·零售
测试者家园1 小时前
如何用AI优化自动化回归测试
自动化测试·软件测试·人工智能·质量效能·回归测试·智能化测试·流程变革
pchmi1 小时前
C# OpenCV机器视觉:特征匹配 “灵魂伴侣”
人工智能·opencv·计算机视觉·c#·特征匹配·opencvsharp
kris00091 小时前
人工智能之深度学习_[4]-神经网络入门
人工智能·深度学习·神经网络