5:OpenCV—图像亮度、对比度变换

1.更改图像和视频的亮度

更改亮度

更改图像的亮度是常用的点操作。在此操作中,图像中每个像素的值应增加/减少一个常数。要更改视频的亮度,应对视频中的每一帧执行相同的操作。

如果要增加图像的亮度,则必须为图像中的每个像素添加一些正常量值。

new_image (i, j) = image(i, j) + c

如果要降低图像的亮度,则必须从图像中的每个像素中减去一些正常量值。

new_image (i, j) = 图像(i, j) - c

例如,说,这是您的原始图像。假设图像的数据类型是CV_8U(即 - 图像中的像素是 8 位无符号的。因此,图像中每个像素的有效值范围应为 0 - 255。

原始图像

假设您想将原始图像的亮度提高 60。因此,您应该为原始图像中的每个像素添加 60。您必须通过在原始图像上加 60 来确保输出图像中的像素值不应超过允许的最大限制。如果超过最大限制,则必须分配最大值而不是正确的值。

这是亮度增加60的输出图像。您可能已经注意到,(3, 1) 位置的像素值为 255,尽管在 200 上加上 60 后,它应该是 260。这是因为此图像的最大允许像素值为 255。

假设您想将原始图像的亮度降低 20。因此,您应该从原始图像中的每个像素中减去 20。您必须确保从原始图像中减去 20 后,输出图像中的像素值不应低于允许的最小限制。如果它低于最小限制,则必须分配最小值而不是正确的值。

这是亮度降低20的输出图像。您可能已经注意到 (0, 0) 位置的像素值为 0,尽管从 8 中减去 20 后它应该是 -12。这是因为具有无符号数据类型的图像的最小允许像素值为 0。

使用 OpenCV 更改图像的亮度

需要在QT中配置包含路径及类库路径

1
2
INCLUDEPATH += D:\Application\opencvdev\opencv3.4.6\rebuild_for_qt\install\include
LIBS += D:\Application\opencvdev\opencv3.4.6\rebuild_for_qt\lib\libopencv_*.a

将上述代码片段复制并粘贴到 IDE 中并运行它。


#include <QCoreApplication>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 读取图像String rootDir = "D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/lena.png";Mat image = imread(rootDir);// 对图片进行亮度增强Mat imageBright50;image.convertTo(imageBright50, -1, 1, 50);Mat imageBright100;image.convertTo(imageBright100, -1, 1, 100);// 对图像进行亮度减少Mat imageDark50;image.convertTo(imageDark50, -1, 1, -50);Mat imageDark100;image.convertTo(imageDark100, -1, 1, -100);// 定义窗口标题String OriginWind = "原图像";String Bright50Wind = "增亮50";String Bright100Wind = "增亮100";String Dark50Wind = "减少亮度50";String Dark100Wind = "减少亮度100";// 创建四个窗体namedWindow(OriginWind, WINDOW_NORMAL);namedWindow(Bright50Wind, WINDOW_NORMAL);namedWindow(Bright100Wind, WINDOW_NORMAL);namedWindow(Dark50Wind, WINDOW_NORMAL);namedWindow(Dark100Wind, WINDOW_NORMAL);// 分别在四个窗口中显示出来完成的图像imshow(OriginWind, image);imshow(Bright50Wind, imageBright50);imshow(Bright100Wind, imageBright100);imshow(Dark50Wind, imageDark50);imshow(Dark100Wind, imageDark100);waitKey(0);destroyAllWindows();return a.exec();
}
亮度增加
亮度降低
解释

让我们逐行浏览上面的示例。


// Read the image file
Mat image = imread("D:/My OpenCV Website/My Guitar.jpg");// Check for failure
if (image.empty())
{cout << "Could not open or find the image" << endl;cin.get(); //wait for any key pressreturn -1;
}

此代码段从指定文件加载图像。如果加载图像失败,程序将退出。

上面的代码段将像素值增加指定的量,并将其存储在给定的输出图像中。如果指定的值为正,则输出图像的亮度将增加。如果指定的值为负,则输出图像的亮度将降低。

Mat imageBrighnessHigh50;
image.convertTo(imageBrighnessHigh50, -1, 1, 50); //increase the brightness by 50Mat imageBrighnessHigh100;
image.convertTo(imageBrighnessHigh100, -1, 1, 100); //increase the brightness by 100Mat imageBrighnessLow50;
image.convertTo(imageBrighnessLow50, -1, 1, -50); //decrease the brightness by 50Mat imageBrighnessLow100;
image.convertTo(imageBrighnessLow100, -1, 1, -100); //decrease the brightness by 100

void Mat::convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const

此函数将每个像素值转换为目标数据类型,并按照以下公式更改值。

pixel_value_of_output_image(x, y) = pixel_value_of_input_image(x, y) * alpha + beta;

  1. m - 输出图像。如果需要,将重新分配此数据结构。
  2. rtype - 输出图像的类型。如果 rtype 为负值,则输出图像的类型将与输入图像的类型相同。
  3. alpha - 在分配给输出图像之前,输入图像中的每个像素将乘以此数字。
  4. beta - 此值将添加到输入图像中的每个像素并分配给输出图像。

//Defining window names for above images
String windowNameOriginalImage = "Original Image";
String windowNameBrightnessHigh50 = "Brightness Increased by 50";
String windowNameWithBrightnessHigh100 = "Brightness Increased by 100";
String windowNameBrightnessLow50 = "Brightness Decreased by 50";
String windowNameBrightnessLow100 = "Brightness Decreased by 100";//Create and open windows for above images
namedWindow(windowNameOriginalImage, WINDOW_NORMAL);
namedWindow(windowNameBrightnessHigh50, WINDOW_NORMAL);
namedWindow(windowNameWithBrightnessHigh100, WINDOW_NORMAL);
namedWindow(windowNameBrightnessLow50, WINDOW_NORMAL);
namedWindow(windowNameBrightnessLow100, WINDOW_NORMAL);//Show above images inside the created windows.
imshow(windowNameOriginalImage, image);
imshow(windowNameBrightnessHigh50, imageBrighnessHigh50);
imshow(windowNameWithBrightnessHigh100, imageBrighnessHigh100);
imshow(windowNameBrightnessLow50, imageBrighnessLow50);
imshow(windowNameBrightnessLow100, imageBrighnessLow100);

上面的代码片段将创建窗口并在其中显示图像。

上面的代码段将等待,直到按下任何键。按键后,所有创建的窗口将被销毁。

1
2
3
waitKey(0); // Wait for any key strokedestroyAllWindows(); //destroy all open windows

使用 OpenCV 更改视频的亮度


#include <QCoreApplication>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 读取图像String VideoDir = "D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/点云应用.mp4";// 打开视频文件并进行数据读取VideoCapture cap(VideoDir);// 定义窗口标题String OriginWind = "原视频";String Bright50Wind = "增亮50";String Bright100Wind = "增亮100";String Dark50Wind = "减少亮度50";String Dark100Wind = "减少亮度100";// 创建四个窗体namedWindow(OriginWind, WINDOW_NORMAL);namedWindow(Bright50Wind, WINDOW_NORMAL);namedWindow(Bright100Wind, WINDOW_NORMAL);namedWindow(Dark50Wind, WINDOW_NORMAL);namedWindow(Dark100Wind, WINDOW_NORMAL);while(true){// 可以把视频中每一帧看成一张图像来进行处理Mat frame;// 通过视频捕获对象来获取每一帧cap.read(frame);// 对图片进行亮度增强Mat imageBright50;frame.convertTo(imageBright50, -1, 1, 50);Mat imageBright100;frame.convertTo(imageBright100, -1, 1, 100);// 对图像进行亮度减少Mat imageDark50;frame.convertTo(imageDark50, -1, 1, -50);Mat imageDark100;frame.convertTo(imageDark100, -1, 1, -100);// 分别在四个窗口中显示出来完成的图像imshow(OriginWind, frame);imshow(Bright50Wind, imageBright50);imshow(Bright100Wind, imageBright100);imshow(Dark50Wind, imageDark50);imshow(Dark100Wind, imageDark100);if (waitKey(10) == 27){cout << "ESC退出程序";break;}}destroyAllWindows();return a.exec();
}

2.更改图像和视频的对比度

更改图像的对比度也是一种常用的点操作。在此操作中,图像中每个像素的值应乘以不等于 1 的正常数。要更改视频的对比度,应对视频中的每个帧执行相同的操作。为了增加图像的对比度,图像中的每个像素都应乘以大于1的正常数。

new_image (i, j) = image(i, j) * c (c > 1)

为了降低图像的对比度,图像中的每个像素都应乘以小于该常数的正常数。

new_image (i, j) = image(i, j) * c (0 < c < 1)

例如,说,这是您的原始图像。假设图像的数据类型为 CV_8U.(即 - 图像中的像素是 8 位无符号的。请参阅 OpenCV C++ API 了解更多信息。因此,图像中每个像素的有效值范围应为 0 - 255。

原始图像

假设您想将原始图像的对比度提高 2 倍。因此,您应该将原始图像中的每个像素乘以 2。必须确保输出图像中的像素值在乘法后不应超过允许的最大限制。如果超过最大限制,则必须分配最大值而不是正确的值。

这是对比度增加 2 倍的图像。您可能已经注意到 (0, 0) 位置的像素值为 255,尽管将 288 乘以 144 后它应该是 2。这是因为此图像的最大允许像素值为 255。

对比度增加 2 倍的图像

比如说,你想将原始图像的对比度减半。因此,您应该将原始图像中的每个像素乘以 0.5。这是对比度降低的图像。

使用 OpenCV 更改图像的对比度


#include <QCoreApplication>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 从文件读取到对象中String rootDir = "D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/lena.png";Mat image = imread(rootDir);// 增加图像对比度Mat constrast2;image.convertTo(constrast2, -1, 2, 0);Mat constrast4;image.convertTo(constrast4, -1, 4, 0);// 减少图形对比度Mat constrastLow_0_5;image.convertTo(constrastLow_0_5, -1, 0.5, 0);Mat constrastLow_0_2_5;image.convertTo(constrastLow_0_2_5, -1, 0.25, 0);// 定义窗口标题String OriginWind = "原图像";String Bright50Wind = "增加2倍";String Bright100Wind = "增加4倍";String Dark50Wind = "减少0.5倍";String Dark100Wind = "减少0.25倍";// 创建四个窗体namedWindow(OriginWind, WINDOW_NORMAL);namedWindow(Bright50Wind, WINDOW_NORMAL);namedWindow(Bright100Wind, WINDOW_NORMAL);namedWindow(Dark50Wind, WINDOW_NORMAL);namedWindow(Dark100Wind, WINDOW_NORMAL);// 分别在四个窗口中显示出来完成的图像imshow(OriginWind, image);imshow(Bright50Wind, constrast2);imshow(Bright100Wind, constrast4);imshow(Dark50Wind, constrastLow_0_5);imshow(Dark100Wind, constrastLow_0_2_5);waitKey(0);destroyAllWindows();return a.exec();
}
对比度增加
对比度降低
代码解释

// Read the image file
Mat image = imread("D:/My OpenCV Website/Christmas.jpg");// Check for failure
if (image.empty())
{cout << "Could not open or find the image" << endl;cin.get(); //wait for any key pressreturn -1;
}

此代码段从指定文件加载图像。如果加载图像失败,程序将退出。

上面的代码段将像素值乘以指定的量,并将其存储在给定的输出图像中。如果指定的值大于 1,则输出图像的对比度将增加。如果指定的值小于 1,则输出图像的对比度将降低。


Mat imageContrastHigh2;
image.convertTo(imageContrastHigh2, -1, 2, 0); //increase the contrast by 2Mat imageContrastHigh4;
image.convertTo(imageContrastHigh4, -1, 4, 0); //increase the contrast by 4Mat imageContrastLow0_5;
image.convertTo(imageContrastLow0_5, -1, 0.5, 0); //decrease the contrast by 0.5Mat imageContrastLow0_25;
image.convertTo(imageContrastLow0_25, -1, 0.25, 0); //decrease the contrast by 0.25

void Mat::convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const

此函数将每个像素值转换为目标数据类型,并按照以下公式更改值。

pixel_value_of_output_image(x, y) = pixel_value_of_input_image(x, y) * alpha + beta;

  1. m - 输出图像。如果需要,将重新分配此数据结构。
  2. rtype - 输出图像的类型。如果 rtype 为负值,则输出图像的类型将与输入图像的类型相同。
  3. alpha - 在分配给输出图像之前,输入图像中的每个像素将乘以此数字。
  4. beta - 此值将添加到输入图像中的每个像素并分配给输出图像。

//Defining window names for above images
String windowNameOriginalImage = "Original Image";
String windowNameContrastHigh2 = "Contrast Increased by 2";
String windowNameContrastHigh4 = "Contrast Increased by 4";
String windowNameContrastLow0_5 = "Contrast Decreased by 0.5";
String windowNameContrastLow0_25 = "Contrast Decreased by 0.25";//Create and open windows for above images
namedWindow(windowNameOriginalImage, WINDOW_NORMAL);
namedWindow(windowNameContrastHigh2, WINDOW_NORMAL);
namedWindow(windowNameContrastHigh4, WINDOW_NORMAL);
namedWindow(windowNameContrastLow0_5, WINDOW_NORMAL);
namedWindow(windowNameContrastLow0_25, WINDOW_NORMAL);//Show above images inside the created windows.
imshow(windowNameOriginalImage, image);
imshow(windowNameContrastHigh2, imageContrastHigh2);
imshow(windowNameContrastHigh4, imageContrastHigh4);
imshow(windowNameContrastLow0_5, imageContrastLow0_5);
imshow(windowNameContrastLow0_25, imageContrastLow0_25);

上面的代码片段将创建窗口并在其中显示图像。由于窗口是通过传递标志WINDOW_NORMAL创建的,因此可以自由调整窗口大小。

上面的代码段将等待,直到按下任何键。按键后,所有创建的窗口将被销毁。

1
2
waitKey(0); // Wait for any key stroke
destroyAllWindows(); //destroy all open windows

使用 OpenCV 更改视频的对比度


#include <QCoreApplication>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);String VideoDir = "D:/Gerry/project/opencvproj/singleandslot/OpenCV-2/ImageAndVideoHandle/resources/点云应用.mp4";// 打开视频文件并进行数据读取VideoCapture cap(VideoDir);// 定义窗口标题String OriginWind = "原视频";String Bright50Wind = "增加2倍对比度";String Bright100Wind = "增加4倍对比度";String Dark50Wind = "减少0.5倍对比度";String Dark100Wind = "减少0.25倍对比度";// 创建四个窗体namedWindow(OriginWind, WINDOW_NORMAL);namedWindow(Bright50Wind, WINDOW_NORMAL);namedWindow(Bright100Wind, WINDOW_NORMAL);namedWindow(Dark50Wind, WINDOW_NORMAL);namedWindow(Dark100Wind, WINDOW_NORMAL);while(true){// 可以把视频中每一帧看成一张图像来进行处理Mat frame;// 通过视频捕获对象来获取每一帧cap.read(frame);// 对图片进行对比度增强Mat imageConstrast2;frame.convertTo(imageConstrast2, -1, 2, 0);Mat imageConstrast4;frame.convertTo(imageConstrast4, -1, 4, 0);// 对图像进行对比度减少Mat imageDark0_5;frame.convertTo(imageDark0_5, -1, 0.5, 0);Mat imageDark0_2_5;frame.convertTo(imageDark0_2_5, -1, 0.25, 0);// 分别在四个窗口中显示出来完成的图像imshow(OriginWind, frame);imshow(Bright50Wind, imageConstrast2);imshow(Bright100Wind, imageConstrast4);imshow(Dark50Wind, imageDark0_5);imshow(Dark100Wind, imageDark0_2_5);if (waitKey(10) == 27){cout << "ESC退出程序";break;}}destroyAllWindows();return a.exec();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/80919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工作流】Fastgpt配置豆包模型-火山引擎

V4.9.7 Fastgpt现在不通过oneapi 来配置模型和渠道了&#xff0c; 可以直接在页面进行设置 首先在账号- 模型提供商里面 填入豆包的信息&#xff1a; 渠道名随便填&#xff0c;厂商选豆包&#xff0c; 然后选3个模型&#xff0c;如图所示 如果没有填入模型映射的话是没办法 …

2025年系统架构师---综合知识卷

1.进程是一个具有独立功能的程序关于某数据集合的一次运行活动,是系统进行资源分配和调度的基本单位(线程包含于进程之中,可并发,是系统进行运算调度的最小单位)。一个进程是通过其物理实体被感知的,进程的物理实体又称为进程的静态描述,通常由三部分组成,分别是程序、…

LangChain4j入门AI(六)整合提示词(Prompt)

前言 提示词&#xff08;Prompt&#xff09;是用户输入给AI模型的一段文字或指令&#xff0c;用于引导模型生成特定类型的内容。通过提示词&#xff0c;用户可以告诉AI“做什么”、 “如何做”以及“输出格式”&#xff0c;从而在满足需求的同时最大程度减少无关信息的生成。有…

如何使用 Docker Compose 部署 Immich

如何使用 Docker Compose 部署 Immich Immich 是一个开源的自建照片和视频备份解决方案&#xff0c;通过 Docker 部署可以快速构建一个稳定的自主管理系统。本文将带你一步步完成使用 Docker Compose 部署 Immich 的过程&#xff0c;帮助你在生产环境中实现高效的媒体管理。 1…

Mac远程连接Windows电脑教程

在 Mac 上通过微软官方远程桌面工具&#xff08;Windows App&#xff09;连接局域网内的 Windows 电脑&#xff0c;需按照以下步骤操作&#xff1a; 一、准备工作 确认 Windows 版本支持远程连接 Windows 专业版/企业版/教育版 支持远程桌面功能。家庭版不支持&#xff0c;需使…

从0到1打造AI Copilot:用SpringBoot + ChatGPT API实现智能开发助手

本文将从0到1系统性地讲解如何基于SpringBoot与OpenAI ChatGPT API打造一款智能开发助手&#xff08;AI Copilot&#xff09;。文章首先介绍AI Copilot的背景与价值&#xff0c;接着深入架构设计与环境准备&#xff0c;然后通过详尽的代码示例演示SpringBoot项目的搭建、依赖配…

Crawl4AI:高效的AI数据抓取工具

在大数据时代&#xff0c;抓取并处理大量数据是进行人工智能&#xff08;AI&#xff09;研究与开发的基础。而网络爬虫是获取网页数据的重要工具。今天&#xff0c;我想介绍一个功能强大的爬虫框架——Crawl4AI&#xff0c;它为数据抓取和机器学习任务提供了无缝的支持。Crawl4…

从单链表 list 中删除第 i 个元素--Python

从单链表 list 中删除第 i 个元素 一、问题引入二、解题步骤1.思维导图2.解题步骤 三、代码实现四、个人总结 一、问题引入 请编写程序&#xff0c;将 n 个整数顺次插入一个初始为空的单链表的表头。随后对任意给定的位序 i&#xff0c;删除链表中第 i 个结点。注意&#xff1…

git学习与使用(远程仓库、分支、工作流)

文章目录 前言简介git的工作流程git的安装配置git环境&#xff1a;git config --globalgit的基本使用新建目录初始化仓库&#xff08;repository&#xff09;添加到暂存区新增/修改/删除 文件状态会改变 提交到仓库查看提交&#xff08;commit&#xff09;的历史记录git其他命令…

九、日志分析和系统故障排查

目录 1、日志分析1.1、日志介绍1.1.1、日志的功能1.1.2、日志文件的分类1.1.3、日志保存位置1.2、rsyslog服务1.2.1、发送日志到远程日志服务器1.3、查看日志文件1.3.1、/var/log/messages文件的内容示例1.3.2、用户登录、退出系统的相关日志1.4、日志级别1.5、程序日志分析1.6…

C++ 非类成员变量 非类成员函数 全局变量 使用

1 使用特点 加 :: 变量使用 #include <iostream> using namespace std; int qwer 100; int asdf 900; void sitl(){std::cout <<"globe dog is sitting." << std::endl; }class Cat { public:static int num;}; int Cat::num 99;class Dog { …

【小乌龙问题】stm32供电,用过的ch340缺无法被识别

解决&#xff1a;更换正确供电&#xff08;stlink&#xff09;&#xff0c;不能用usb-ttl的仅供电&#xff0c;会干扰的&#xff01;&#xff01;&#xff01;&#xff01; 原来用stlink供电&#xff0c;今天没拿就想着usb-ttl的电源供电&#xff0c;然后用ch340传输数据&…

使用 Navicat 17 for PostgreSQL 时,请问哪个版本支持 PostgreSQL 的 20150623 版本?还是每个版本都支持?

&#x1f9d1;‍&#x1f4bb; PostgreSQL 用户 使用 Navicat 17 for PostgreSQL 时&#xff0c;请问哪个版本支持 PostgreSQL 的 20150623 版本&#xff1f;还是每个版本都支持&#xff1f; &#x1f9d1;‍&#x1f527; 官方技术中心 Navicat Premium 17 和 Navicat for P…

游戏引擎学习第305天:在平台层中使用内存 Arena 的方法与思路

回顾前一天内容&#xff0c;并为今天的开发工作设定方向 我们正在直播制作完整游戏&#xff0c;当前正在实现一个精灵图&#xff08;sprite graph&#xff09;的排序系统。排序的代码已经写完&#xff0c;过程并不复杂&#xff0c;虽然还没做太多优化&#xff0c;但总体思路比…

PHP-FPM 调优配置建议

1、动态模式 pm dynamic; 最大子进程数&#xff08;根据服务器内存调整&#xff09; pm.max_children 100 //每个PHP-FPM进程大约占用30-50MB内存(ThinkPHP框架本身有一定内存开销)安全值&#xff1a;8GB内存 / 50MB ≈ 160&#xff0c;保守设置为100 ; 启动时创建的进程数&…

腾讯2025年校招笔试真题手撕(一)

一、题目 有n 把钥匙&#xff0c;m 个锁&#xff0c;每把锁只能由一把特定的钥匙打开&#xff0c;其他钥匙都无法打开。一把钥匙可能可以打开多把锁&#xff0c;钥匙也可以重复使用。 对于任意一把锁来说&#xff0c;打开它的钥匙是哪一把是等概率的。但你无法事先知道是哪一把…

【北邮通信系统建模与仿真simulink笔记】(2)2.3搭建仿真模型模块操作运行仿真

【声明】 本博客仅用于记录博主学习内容、分享笔记经验&#xff0c;不得用作其他非学术、非正规用途&#xff0c;不得商用。本声明对本博客永久生效&#xff0c;若违反声明所导致的一切后果&#xff0c;本博客均不负责。 目录 【声明】 一、搭建第一个仿真模型 二、模块操作…

系统与账户安全

SYS-01&#xff1a;Windows的账户安全 安全配置核心原则&#xff1a; 强密码策略&#xff1a; 通过组策略设置密码复杂度&#xff1a; # 启用密码复杂度要求 secedit /export /cfg secpolicy.inf # 修改文件中的 "PasswordComplexity 1" secedit /configure /db …

COMPUTEX 2025 | 广和通5G AI MiFi解决方案助力移动宽带终端迈向AI新未来

随着5G与AI不断融合&#xff0c;稳定高速、智能的移动网络已成为商务、旅行、户外作业等场景的刚需。广和通5G AI MiFi方案凭借领先技术与创新设计&#xff0c;重新定义5G移动网络体验。 广和通5G AI MiFi 方案搭载高通 4nm制程QCM4490平台&#xff0c;融合手机级超低功耗技术…

免费开放试乘体验!苏州金龙自动驾驶巴士即将上线阳澄数谷

近日&#xff0c;苏州自动驾驶巴士线路——阳澄数谷示范线正式上线&#xff0c;即日起向全民免费开放试乘体验&#xff01; 在苏州工业园区地铁3号线倪浜•阳澄数谷站外&#xff0c;一辆辆黑、白配色的小巴正在道路上有条不紊地行驶。与普通公交不同的是&#xff0c;小巴造型奇…