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()

效果如下

相关推荐
2601_96544887几秒前
AI视频制作:做历史视频,用 AE 做人物时间线太难,AI怎么直接生成人物年表动画?
人工智能·音视频
xierui1231231 分钟前
视频Agent如何制作英文版:脚本、配音、字幕与画面文字的协同流程
人工智能·音视频
狂师2 分钟前
夯爆了!分享几个我在用的,基于业务场景接口串联测试Skill !
人工智能·后端·测试
wasee0013 分钟前
三四线城市适合投资XR大空间吗?投入、客流与回本周期测算
大数据·人工智能
C++ 老炮儿的技术栈4 分钟前
机器人的坐标,像 XYZ 的坐标值,是用单精度浮点还是用双精度浮点?
c语言·c++·人工智能·单片机·c
IT_陈寒6 分钟前
Vue项目实战经验分享:动态组件在Keep-Alive下的缓存陷阱
前端·人工智能·后端
染指11108 分钟前
157.Agent-LangGraph-工具(实现ReAct Agent模式)
开发语言·人工智能·python·langchain·agents
Raas1009 分钟前
MAI Gateway选购攻略:开源AI网关有哪些?避坑指南与对比
大数据·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
段一凡-华北理工大学9 分钟前
高炉能源系统智能化:热风炉、煤气与极致能效~系列文章03:热风炉烧炉与风温的决定因素
大数据·linux·人工智能·能源·热风炉·高炉能源优化
lucas_AI11 分钟前
Anthropic 递交 S-1:半年营收 163 亿美元,招股书里写着'人类生存风险'
人工智能