首页 > 其他分享 >【树莓派学习笔记2】opencv常用的视觉方案,特征颜色提取,模式匹配,图形映射函数

【树莓派学习笔记2】opencv常用的视觉方案,特征颜色提取,模式匹配,图形映射函数

时间:2024-08-14 21:51:52浏览次数:13  
标签:树莓 映射函数 photo image point cv2 aim opencv 图像

本文主要介绍opencv里面一些常用的视觉方案,所需的全部代码均在如下

1.给视觉单独开一个进程持续运行并更新全局变量

# 获取并处理图像
def get_image():
    while True:
        # 开全局变量处理,分理处红绿蓝
        global image, image_red, image_green, image_blue
        # 从摄像头获取图像
        _,image=capture.read()
        image_red=image[:,:,2].astype(np.float32)
        image_green=image[:,:,1].astype(np.float32)
        image_blue=image[:,:,0].astype(np.float32)
        #cv2.imshow('image',image)
        #cv2.waitKey(1)

# 获取图像单独开进程
get_image_threading = threading.Thread(target=get_image)
get_image_threading.start()

2.图形的映射变换

2.1针对图像的映射

图形的映射变换在视觉中经常使用,而且很容易将点的顺序搞混,一旦搞混很难把顺序重新找回来。我这里是二维的图形变换,可以将指定的二维图像的四个点映射到另外背景图上指定的4个点

# 获取需要变换的原始图像
photo_origin = cv2.imread('photo_origin.jpg')
# 这里我把图形转换为灰度图再进行映射变换
photo_origin=cv2.cvtColor(photo_origin, cv2.COLOR_BGR2GRAY)
# 获取背景图片(即你希望将图片映射到的背景,注意这里的背景图是三色图)
back_ground = cv2.imread('back_ground.jpg')
# 对应原先图像的,左上,左下,右下,右上,四个点(这里的四个点是我之前题目的点,你要更换成你自己的,下同)
pts0=np.float32([[63,165],[413,116],[413,562],[53,502]])
# 建立映射需要的一一对应(这个顺序是定死了的)
pts1=np.float32([[pts0[0][1],pts0[0][0]],[pts0[3][1],pts0[3][0]],[pts0[2][1],pts0[2][0]],[pts0[1][1],pts0[1][0]]])
# 对应映射后图像,左上,左下,右下,右上,四个点(记得更换为你自己的点)
pts2=np.float32([[0,0],[968,0],[968,968],[0,968]])
# 生成最为关键的变换矩阵
M = cv2.getPerspectiveTransform(pts1,pts2)
# 变换后的图形(这里注意,你的变换后的图像背景是全黑的,需要用cv2.add函数将图像和另一图像相结合)
photo_trans = cv2.warpPerspective(photo_origin,M,(back_ground.shape[1],back_ground.shape[0]))
show_image(photo_trans)
2.2针对某一个点的映射

这里是让我们单独把原来图像中的某一个点映射到变换后图像上的点,这样就避免了反复地把图像进行整体的映射变换,而只需对一个点进行操作

# 这里的M就是前面已经计算出来的M矩阵(建议保存后这里就可以直接导入)
M=np.load('M.npy')
# 这里的point_origin就是要准备变换的原来的点
def trans_point(point_origin):
    global point_trans
    try:
        point2=np.array([point_origin[1],point_origin[0],1])
        # 这里相当于是把一个单点给映射变换过去了
        point3=np.dot(M,point2)
        # point_trans就是变换后的点
        point_trans=[point3[1]/point3[2],point3[0]/point3[2]]
    except:
        point_trans=point_trans
    return point_trans

3.模式匹配并获取目标位置坐标

注意:模式匹配寻找目标图形的精度不高,要求照片里的图像与给的目标图像极为相似才能匹配成功,而且模式匹配是针对灰度图的识别,所以不能区分颜色。所以一般需要现将照片先处理一下,比如突出某种颜色或者过滤一些噪点后再使用,可能效果会更好

# 模式匹配获取目标位置,这里都统一采用灰度图
# 这个是目标图像
aim_image = cv2.imread('aim.png')
# 这个是目标图像的灰度图
aim_gray = cv2.cvtColor(aim_image, cv2.COLOR_BGR2GRAY)
threshold = 0.8
def get_aim_point(aim_gray,image_gray):
    global aim_center
    try:
        result = cv2.matchTemplate(image_gray, aim_gray, cv2.TM_CCOEFF_NORMED)
        locations = np.where(result >= threshold)
        # 转换为(x, y)坐标
        locations = list(zip(*locations[::-1]))
        # 转换为目标中心点坐标
        aim_center=np.array([int(locations[0][1] + aim_image.shape[0] / 2),int(locations[0][0] + aim_image.shape[1] / 2)])
    except:
        aim_center=aim_center
    return(aim_center)

4.突出图像中的红色部分,其余部分都过滤掉(配合前面的视觉线程使用,蓝色和绿色同理)

# 突出图像中的红色目标
def get_red():
    global image, image_red, image_green, image_blue
    image_red_only=image_red*2-image_blue-image_green
    image_red_only[image_red_only<0]=0
    return image_red_only

5. 拍照,保存一张照片(图片类型为.jpg)

# 拍照,保存一张照片
def take_photo(photo_name):
    global capture
    photo_name=photo_name+'.jpg'
    _,image=capture.read()
    cv2.imwrite(photo_name,image)
    print('take photo success')

6.用matplotlib展示一张numpy数据类型的图片

这里注意一下,用opencv保存的图片与matplotlib展示图片时,红色与绿色色素似乎是反过来的

# 展示图片
def show_image(image):
    image_show=image.astype(np.uint8)
    plt.imshow(image_show, cmap='gray')
    plt.axis('off')  # 不显示坐标轴
    plt.show()

本文章持续更新中,有不足或者遗漏的地方还望多多指正 

标签:树莓,映射函数,photo,image,point,cv2,aim,opencv,图像
From: https://blog.csdn.net/qq_57837641/article/details/141197643

相关文章

  • opencv图像去雾
    1、何恺明的暗通道去雾算法     论文原文:SingleImageHazeRemovalUsingDarkChannelPrior|IEEEJournals&Magazine|IEEEXplore     参考博客:[论文阅读](11)ACE算法和暗通道先验图像去雾算法(Rizzi|何恺明老师)_暗通道去雾算法_Eastmount的博客......
  • OpenCV图像处理——直线拟合并找出拟合直线的起点与端点
    引言对轮廓进行分析,除了可以对轮廓进行椭圆或者圆的拟合之外,还可以对轮廓点集进行直线拟合。在OpenCV中,直线拟合通常是通过cv::fitLine函数实现的,该函数采用最小二乘法对一组2D或3D点进行直线拟合。对于2D点集,拟合结果是一个cv::Vec4f类型的向量,包含了直线的方......
  • OpenCV(cv::waitKey())
    目录1.函数解析参数返回值2.示例3.说明4.注意事项cv::waitKey()是OpenCV库中的一个函数,用于等待用户的键盘输入。它在处理图像和视频时非常有用,特别是在显示图像窗口时,用于控制图像的显示和响应用户输入。1.函数解析intcv::waitKey(intdelay=0);参数delay:......
  • OpenCV-图片操作
    一.多种形态学形态学变换(MorphologicalTransformations)是一种基于形状的简单变换,它的处理对象通常是二值化图像。形态学变换有两个输入,一个输出:输入为原图像、核(结构化元素),输出为形态学变换后的图像。1.核核(kernel)其实就是一个小区域,通常为3*3、5*5、7*7大小,有着其自己......
  • Debian下使用OpenCV库保存摄相头数据为图片(arm)
    在《移植OpenCV3.1到BBB-Debian》一文件中配置好的环境为前提(后期不特别说明,ARM版的例子均以该环境为基础),编写使用OpenCV库保存WEBCAM的数据为图片的代码,下面是相应的源码和编译配置文件(都保存在SaveCamPic目录下):1.源码scp.cpp#include<stdio.h>#include<sys/stat.h>#in......
  • OpenCv学习-python
    一.OpenCv介绍简介OpenCV(OpenSourceComputerVisionLibrary:opencv官网地址)是一个开源的基于BSD许可的库,它包括数百种计算机视觉算法。文档OpenCV2.xAPI描述的是C++API,相对还有一个基于C语言的OpenCV1.xAPI,后者的描述在文档opencv1.x.pdf中。OpenCV具有模块化结......
  • opencv学习笔记(一)
    前言本文为本人观看b站视频学习opencv的笔记分享,如有错误欢迎指正,如有侵权联系我删除,视频链接一、ReadImagesVideosandWebcams#include<opencv2/imgcodecs.hpp>#include<opencv2/highgui.hpp>#include<opencv2/imgproc.hpp>#include<iostream>usingnamespaces......
  • (二) 树莓派CM4调试
    1.参考资料资料汇总页面https://shumeipai.nxez.com/raspberry-pi-datasheets《bcm2711-peripherals.pdf》,下载地址https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf《cm4io-datasheet.pdf》,下载地址https://datasheets.raspberrypi.com/cm......
  • OpenCV学习过程(6)
    目录1.模板匹配方法:(一般建议使用归一化的后三种方法) 代码演示:2.傅里叶变换代码演示过程:显示幅度谱:低通滤波处理后的图像:高通滤波处理后的图像:1.模板匹配模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,这个差别程......
  • OpenCV C++ 霍夫直线变换-Hough Line Transform
    使用OpenCV在C++中实现霍夫直线变换(HoughLineTransform)可以通过以下步骤完成。我们将首先进行边缘检测,然后应用霍夫直线变换来检测图像中的直线。步骤概述读取图像:使用cv::imread读取图像。灰度转换:将图像转换为灰度图。边缘检测:使用Canny边缘检测器。霍夫直线......