一、 CV确定对象的方向
介绍如何使用OpenCV确定对象的方向(即旋转角度,以度为单位)。
先决条件 安装Python3.7或者更高版本。可以参考下文链接: https://automaticaddison.com/how-to-set-up-anaconda-for-windows-10/ 或者自行下载安装:https://www.python.org/getit/相关包安装与设置 在我们开始之前,让我们确保我们已经安装了所有的软件包。检查您的机器上是否安装了OpenCV 。如果你使用 Anaconda,你可以输入:conda install -c conda-forge opencv或者使用pip安装,指令:pip install opencv-python安装科学计算库 Numpy:pip install numpy准备测试图像 找一张图片。我的输入图像宽度为 1200 像素,高度为 900 像素。我的输入图像的文件名是input_img.jpg。编写代码 这是代码。它接受一个名为input_img.jpg的图像并输出一个名为output_img.jpg的带注释的图像。部分代码来自官方 OpenCV 实现: https://docs.opencv.org/4.x/d1/dee/tutorial_introduction_to_pca.html
运行结果
使用PCA(主成分分析)方法获取物体的主方向,效果如下:
了解旋转轴
每个对象的正 x 轴是红线。每个对象的正 y 轴是蓝线。 全局正x 轴从左到右水平穿过图像。全局正z 轴指向此页外。全局正y 轴从图像底部垂直指向图像顶部。 使用右手定则测量旋转,将四根手指伸直(食指到小指)沿全局正 x 轴方向伸出。
然后将四根手指逆时针旋转 90 度。您的指尖指向正 y 轴,而您的拇指指向页面外指向正 z 轴。 计算0~180°之间的方向最终输出结果:
参考链接:https://automaticaddison.com/how-to-determine-the-orientation-of-an-object-using-opencv/
二、 汽车型号图片搜索
该项目将分两个阶段执行。首先,我们将收集数据并将其转换为矢量。在第二阶段,我们将使用该数据以及输入图像,使用Streamlit框架显示类似的图像。
配置环境
我们将使用ImageBind,这是 Meta 开发的开源库,用于将图像转换为矢量。
代码首先安装 ImageBind 库,该库需要从其 GitHub 存储库克隆才能正确集成和使用。
此外,我们还需要一些其他库,包括ultralytics和qdrant-client,以确保项目正确高效地运行。
数据采集
我们收集了一系列代表各种类型汽车及其各自价格的图片。
请从这里访问数据集:
随后,将它们存储在列表中:一个用于存储名称,另一个用于存储各自的价格。
导入库
现在让我们导入将图像转换为嵌入所需的所有必要库。
图像分割
我们将使用YOLOv8算法裁剪掉汽车,从而从图像中去除不必要的噪音。
为了实现这一点,我们首先借助YOLOv8在汽车周围绘制一个边界框,然后使用OpenCV剪切出该区域,最后将图像保存在目录中。
图像转矢量
接下来,我们将使用ImageBind库将裁剪的图像转换为矢量嵌入,从而将其转换为数字格式。
注意:这是一个耗时的过程,因为它将从互联网上下载模型。
为了减少处理时间,您可以设置pretrained=False,尽管这会降低模型的准确性。
让我们保存嵌入以供稍后在代码中使用。
相似图片搜索
进入代码的第二阶段,我们将继续以图像作为输入并识别最相似的图像。随后,我们将显示这些图像及其各自的价格。
导入库
除了先前导入的库之外,还需要以下附加库:
现在我们将通过启动ImageBind模型来启动代码,该模型会将上传的输入图像转换为矢量嵌入。
让我们继续打开保存的文件“embedded_data.pickle”,其中包含我们的图像数据集的矢量数据。
存储矢量数据
我们将利用开源矢量数据库Qdrant来存储所有图像的嵌入并将其与输入图像进行比较。
比较图像
接下来,我们将把存储在Qdrant数据库中的每个向量嵌入与提供给程序的输入图像进行比较。
这将通过 3 个步骤完成:
- 从图像中裁剪汽车。
- 将裁剪的图像转换为矢量嵌入。
- 将该向量与其他图像的向量进行比较。
在这个过程中,我们采用余弦相似度来评估嵌入之间的相似度。
我们声明了一个函数,该函数以图像作为输入,并给出与输入图像最相似的 4 张图像的索引。
部署模型
我们现在将继续为我们的模型开发前端 Web 应用程序,以增强交互性和用户友好性。
为了实现这一点,我们将利用Streamlit以简单有效的方式为我们的 Python 应用程序创建 Web 界面。
我们将首先配置页面并将文件上传器小部件集成到网页上。
现在我们将创建一个函数来显示带有适当填充和边距的图像以及价格。此函数将图像和价格表作为输入,并以格式化的方式将其显示在网页上。
最后,我们将读取上传的图像作为输入,将其转换为NumPy数组,并将其作为输入提供给image_to_similar_index我们之前定义的函数,该函数将返回与输入最相似的图像的索引。
然后,我们将检索与返回的索引相对应的图像和价格,并将它们提供给函数display_images_with_padding_and_price,该函数将格式化图像并将其显示在网页上。
最终输出
将图片上传到网页后,ImageBind模型会开始加载,这可能需要一点时间。但是,一旦模型完全加载,图片就会转换为嵌入,并与其他图片进行比较,以找出最相似的图片。随后,相似的图片就会显示在网页上。天皓智联 开发板商城 视觉等相关设备
完整代码: