Visual Studio 2017 + opencv4.6 + contribute + Cmake(Aruco配置版本)指南

2301_81505962 2024-01-30 09:42:28

之前配置过一次这个,想起这玩意就难受,贼难配置。由于要用到里面的一个库,不得已再进行配置。看网上的博客是真的难受,这写一块,那里写一块,乱七八糟,配置一顿发现写的都是错的,还得重新配置。(本篇文章开始配置错了,然后是重新配置的,需要全文通读

A. 最初配置(问题版)

一. 安装环境

系统:windows10

软件: ①Visual Studio 2017  下载网址:下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux

②Cmake(.msi文件,我这里是3.22版本) 下载网址:CMake - Upgrade Your Software Build System

文件:

①opencv 4.6.0 下载网址:Releases - OpenCV

https://opencv.org/releases/

https://opencv.org/releases/

②opencv_contribute 下载网址:GitCode - 开发者的代码家园

https://gitcode.com/opencv/opencv_contrib/tree/4.x?utm_source=csdn_github_accelerator&isLogin=1

https://gitcode.com/opencv/opencv_contrib/tree/4.x?utm_source=csdn_github_accelerator&isLogin=1

二. Cmake安装过程

这里只进行讲解Cmake的安装过程,别的安装过程没啥特别注意点

https://img-blog.csdnimg.cn/direct/6058466c4b8a491b8987450274ca3fb4.png

我把所有的文件安装到了这个位置

https://img-blog.csdnimg.cn/direct/39367da9612c4e53a68751558790d8c0.png

三. Cmake编译过程

第一步:在opencv文件夹之中新建文件夹

https://img-blog.csdnimg.cn/direct/f62b0ad1b4c849ed902c65ba3460457b.png

第二步:打开相应的Cmake软件

进行如下操作

https://img-blog.csdnimg.cn/direct/371a1365c0014bd4969127ff09a8c8cf.png

第三步: 打开你的VPN,连接外网

https://img-blog.csdnimg.cn/direct/79f1fbfec5924c1fad9e2115e7666f4b.png

第四步:配置环境

https://img-blog.csdnimg.cn/direct/a83cfa8d32bf4799af9def376f34039e.png

第五步:检测错误

一般而言,咱们在进行配置的时候,会出现上下两个部分都出错的情况

https://img-blog.csdnimg.cn/direct/0525d27cc0a4413b8d92b07b8a65c699.png

第二个部分解决方式:

错误一:

https://img-blog.csdnimg.cn/direct/3bbe0f05a60e496aa49a1ebff182af6d.png

网上查了一下,这个地方的问题时由于Cmake没有安装到C盘的原因(但是我也不知道对不对,我感觉安装到别的地方也没事。为了规避出现错误,我就安装到c盘吧),我去,是真恶心。

边进行上面安装,一边下载python2.7,下载官网:Python Release Python 2.7.0 | Python.org

https://img-blog.csdnimg.cn/direct/65821044489841b69535d4eaad8109e5.png

https://img-blog.csdnimg.cn/direct/1dc2bd85c19f47d0a920119243dd9f93.png

找到电脑的系统变量,这个是很好找到的,进行添加。

https://img-blog.csdnimg.cn/direct/e89010025de24bae98ae9cee4b2d40ef.png

错误二:

将“OPENCV_GENERATE_SETUPVARS”之中的对号不选中,

https://img-blog.csdnimg.cn/direct/d0dad782236a4f8d8a9d4f37ae925504.png

第一个部分解决方式:

在界面中的变量中找到“BUILD_opencv_world”和“OPENCV_ENABLE_NONFREE”变量,在变量后面选中√。

https://img-blog.csdnimg.cn/direct/e2ae44623dae4799be8d307df57ba01a.png

https://img-blog.csdnimg.cn/direct/eba070bcfea044858ddc9073b1222ae0.png

找到“OPENCV_EXTRA_MODULES_PATH”变量,在此变量后面加上contribute_4.6之中的module路径。

https://img-blog.csdnimg.cn/direct/262e1132848c48108b1badd959faf8d6.png

在此点击,configure即可。

可以见到上下两个部分都没有报错。

https://img-blog.csdnimg.cn/direct/bda635955fc647bdab0fd7f2ac455f09.png

直接点击Generate即可,

https://img-blog.csdnimg.cn/direct/5e7071db4b254993a9686c275e15b196.png

配置完成。

但是第二部分有的时候解决方式:我之前遇到过很多次,剧难配置。

(1)打开编译路径下的,“CMakeDownloadLog.txt”文件。

https://img-blog.csdnimg.cn/direct/8f38223e18e94236b35a33371c06033a.png

打开之后是这个样子的

https://img-blog.csdnimg.cn/direct/edd6f96acbfa4ee2aeaf6218f548700e.png

哎呀,字体有点小看不清放大一点:

https://img-blog.csdnimg.cn/direct/d0039eab78284605ace007fd04c26565.png

(2)看一下我缺失的文件,找do_copy、missing、check_md5、copy是一组

#do_copy "opencv_videoio_ffmpeg.dll" "5573e2262ad1298e603122b7759fc2f6" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/65ec04d4573dcdfa4531f0b9e67f35d8ffff873e/ffmpeg/opencv_videoio_ffmpeg.dll" "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg"
#missing "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg/opencv_videoio_ffmpeg.dll"
#check_md5 "D:/opencvuse/opencv/sources/.cache/ffmpeg/5573e2262ad1298e603122b7759fc2f6-opencv_videoio_ffmpeg.dll"
#copy "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg/opencv_videoio_ffmpeg.dll" "D:/opencvuse/opencv/sources/.cache/ffmpeg/5573e2262ad1298e603122b7759fc2f6-opencv_videoio_ffmpeg.dll"

#do_copy "opencv_videoio_ffmpeg_64.dll" "5f9e2b2e04c15f080f40e844de80c867" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/65ec04d4573dcdfa4531f0b9e67f35d8ffff873e/ffmpeg/opencv_videoio_ffmpeg_64.dll" "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg"
#missing "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg/opencv_videoio_ffmpeg_64.dll"
#check_md5 "D:/opencvuse/opencv/sources/.cache/ffmpeg/5f9e2b2e04c15f080f40e844de80c867-opencv_videoio_ffmpeg_64.dll"
#copy "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg/opencv_videoio_ffmpeg_64.dll" "D:/opencvuse/opencv/sources/.cache/ffmpeg/5f9e2b2e04c15f080f40e844de80c867-opencv_videoio_ffmpeg_64.dll"

#do_copy "ffmpeg_version.cmake" "8862c87496e2e8c375965e1277dee1c7" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/65ec04d4573dcdfa4531f0b9e67f35d8ffff873e/ffmpeg/ffmpeg_version.cmake" "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg"
#missing "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg/ffmpeg_version.cmake"
#check_md5 "D:/opencvuse/opencv/sources/.cache/ffmpeg/8862c87496e2e8c375965e1277dee1c7-ffmpeg_version.cmake"
#copy "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg/ffmpeg_version.cmake" "D:/opencvuse/opencv/sources/.cache/ffmpeg/8862c87496e2e8c375965e1277dee1c7-ffmpeg_version.cmake"

可以看到我这里是缺失了三个文件,当然这个地方可以去找就可以,然后复制下来,但是非常难找。

(3)分别查找三个文件,进行下载

#do_copy "opencv_videoio_ffmpeg.dll" "5573e2262ad1298e603122b7759fc2f6" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/65ec04d4573dcdfa4531f0b9e67f35d8ffff873e/ffmpeg/opencv_videoio_ffmpeg.dll" "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg"
#missing "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg/opencv_videoio_ffmpeg.dll"
#check_md5 "D:/opencvuse/opencv/sources/.cache/ffmpeg/5573e2262ad1298e603122b7759fc2f6-opencv_videoio_ffmpeg.dll"
#copy "D:/opencvuse/opencv/opencv_contribute/3rdparty/ffmpeg/opencv_videoio_ffmpeg.dll" "D:/opencvuse/opencv/sources/.cache/ffmpeg/5573e2262ad1298e603122b7759fc2f6-opencv_videoio_ffmpeg.dll"

a.首先打开copy最后一行所在的目录下的文件: "D:/opencvuse/opencv/sources/.cache/ffmpeg/5573e2262ad1298e603122b7759fc2f6-opencv_videoio_ffmpeg.dll"

https://img-blog.csdnimg.cn/direct/544b473c6521497d8a5f60d2804b1d43.png

将“5573e2262ad1298e603122b7759fc2f6-opencv_videoio_ffmpeg.dll”进行删除。

b.在do_copy之中查找第三个双引号之中的内容https://raw.githubusercontent.com/opencv/opencv_3rdparty/65ec04d4573dcdfa4531f0b9e67f35d8ffff873e/ffmpeg/opencv_videoio_ffmpeg.dll,复制到浏览器中下载

https://img-blog.csdnimg.cn/direct/5c90725d7ce6487686dca2c05bb80bc8.png

c.将上述之中的.dll重命名为“5573e2262ad1298e603122b7759fc2f6-opencv_videoio_ffmpeg.dll”

https://img-blog.csdnimg.cn/direct/3772a0b515bb43b7ae22d14afdec731a.png

已经重命名,进行复制。

d.将其粘贴到与a步骤相同的目录下。

e.上述的a-d步骤将第一个文件配置好了,开始进行第二个、第三个文件的配置,同第一个文件。

但是第三个文件我下载不下来,试一下,看看有没有问题

四. visual studio环境配置

第一步: 打开安装目录下的.sln文件

https://img-blog.csdnimg.cn/direct/c34d12844a744af98f85b025e8d4ccf1.png

第二步:

https://img-blog.csdnimg.cn/direct/79d5490e3b95408da288b9c4e5d2e3bd.png

第三步:

https://img-blog.csdnimg.cn/direct/6cabc7013775483ca12ebcd2efe36878.png

https://img-blog.csdnimg.cn/direct/b91d9ab5c9944b78bf38eb65e27b6a84.png

点击右上角的生成。接着听一首 “送你一朵小红花”:网易云音乐网易云音乐是一款专注于发现与分享的音乐产品,依托专业音乐人、DJ、好友推荐及社交功能,为用户打造全新的音乐生活。

https://music.163.com/#/song?id=2108827960&market=baiduqk

https://music.163.com/#/song?id=2108827960&market=baiduqk

再来一首黄霄雲的“打开”:

网易云音乐网易云音乐是一款专注于发现与分享的音乐产品,依托专业音乐人、DJ、好友推荐及社交功能,为用户打造全新的音乐生活。

https://music.163.com/#/song?id=558097640&market=baiduqk

https://music.163.com/#/song?id=558097640&market=baiduqk听完两首歌,等了俩小时。

https://img-blog.csdnimg.cn/direct/a4018769a4f048b2a127e82e426d3957.png

还是配置错了。

https://img-blog.csdnimg.cn/direct/7dcc2eda07c74140ab8af1c5602e34d2.png

可以见到我在上面进行配置的时候出现的错误是无法打开当前目录下的输入文件....\lib\Release\opencv_world460.lib

B. 第二天重新进行配置

错误的发现:

上面的网址我是打开的:GitHub - opencv/opencv_contrib: Repository for OpenCV's extra modules

他的界面是这样的

https://img-blog.csdnimg.cn/direct/6e2909340d9a485588ddcd4eb6f195b1.png

我直接将其进行了下载,作为opencv_contribute,是错误的。

需要点击tags按钮选择自己的版本

https://img-blog.csdnimg.cn/direct/c3b6d332cbfc4c208467ac907576e497.png

此刻网址变为:https://github.com/opencv/opencv_contrib/tags 

https://img-blog.csdnimg.cn/direct/37c241aee77949e89450a157342891e3.png

将其下载下来就可以了。

https://img-blog.csdnimg.cn/direct/b20b38133381453dbb2a28cf3c9f275a.png

这里我建议两个同时下载,一开始我只下载一个,速度比较慢,然后同时下载,发现第二个压缩包更快一点。

https://img-blog.csdnimg.cn/direct/07e5aa69720e4bb9a8a7b948769a9dac.png

重新配置版本:

一. 将opencv4.6进行重新配置

下载opencv放置到opencv4.6文件中

https://img-blog.csdnimg.cn/direct/5241c82ae43248cb9f16c9db79873f4f.png

打开属性管理器

https://img-blog.csdnimg.cn/direct/4996cadf00944222aa2844e4aff8d2cc.png

右键打开属性页,配置(不过多赘述)

https://img-blog.csdnimg.cn/direct/8ad8e9efb0614757a3c8bb24f979aee8.png

https://img-blog.csdnimg.cn/direct/1c756b25162c4b2d92d78d1d503f1c1a.png

测试:

#include <opencv2\opencv.hpp>    // 加载opencv4头文件
#include <iostream>

using namespace cv;        //opencv的命名空间
using namespace std;

int main(int argc, char argv) {

    Mat img;                    // 声明一个保存图像的类
    img = imread("被匹配图.png");        // 读取图像
    //resizeWindow("input", 300, 400);        // 设置窗口大小为300 * 400像素
    namedWindow("input", WINDOW_NORMAL);        // 创建一个具有自适应大小的窗口
    imshow("input", img);                // 显示图像
    waitKey(0);                    // 等待键盘输入
    destroyAllWindows();
    return 0;
}

https://img-blog.csdnimg.cn/direct/fce6b62f7a3f4275b742a77b4e7538ea.png

成功。

二.下载Cmake3.26.2

连接外网,配置过程同上述过程。

新建文件夹

https://img-blog.csdnimg.cn/direct/675f306deb6f4da0a19661a55e041f1b.png

选择文件夹(步骤同上)

https://img-blog.csdnimg.cn/direct/32183217e6af485ca69eda273a1cf351.png

https://img-blog.csdnimg.cn/direct/85668a02e29044a0a6e500a34affb432.png

见到下半部分出现错误

https://img-blog.csdnimg.cn/direct/a0288402b006448f8de331fd72fa3e22.png

同上面的步骤进行两个选√、一个去√和一个配置路径的过程。

针对于第二部分报红:

以第一个报红为例,此处参考vs2017+cuda10..02+cudnn7.6.5+opencv4.4+opencv_contribute编译_cuda10.2+opencv4.7-CSDN博客

https://img-blog.csdnimg.cn/direct/8296b91a4b904c9bb6645d21063cf6d3.png

将 download_vgg.cmake中的https://raw.githubusercontent.xn--comhttps-zg0m521q//raw.staticdn.net

之后重新在cmake 里configure即可。

https://img-blog.csdnimg.cn/direct/0a3b259a9cef442bb7b68c7e88c1e3a3.png

其他错误:将https://raw.githubusercontent.xn--comhttps-zg0m521q//raw.staticdn.net 里面有一些chatqr错误,因为我不用,所以缺失就缺失吧。

之后configure直到不报红。

https://img-blog.csdnimg.cn/direct/4cb4a9d13ee143edb62e8e09af80a7ec.png

打开opencv.sln

https://img-blog.csdnimg.cn/direct/e0147084c6e84367addf2c66fe316f6b.png

重新生成解决方案:

https://img-blog.csdnimg.cn/direct/51b2dcebb38645bbb0ed8fd7ff8e4cc0.png

https://img-blog.csdnimg.cn/direct/5b497dc3b9f043e1bdcfb741205324cd.png

成功生成109个,失败1个,跳过10个。先试一试,忽略那个失败,继续进行。

https://img-blog.csdnimg.cn/direct/32322b17fe6540b6b2e80b6490022896.png

https://img-blog.csdnimg.cn/direct/92a4a104a0764f6a991c28998289ea19.png

https://img-blog.csdnimg.cn/direct/bc1bd2e1ee164558a98d18a1d3fc2ff8.png

发现没有生成install,重试

非常重要之关于第二部分报红最佳解决方式​​​​​​​

见我的博客

见我博客:Cmake+VS2017+Opencv+OpencvContrib+PCL1.8.1配置过程之中问题的出现(如何避坑)_vs2017+opencv+pcl-CSDN博客文章浏览阅读1.2k次。Cmake+VS2017+Opencv+OpencvContrib+PCL1.8.1配置过程之中问题的出现(如何避坑),对于在Cmake+VS2017+Opencv+OpencvContrib配置过程之中出现问题的过程进行一个思路整理,当然,这里的问题可能是我出现的,仅仅是供给参考.不得不吐槽一下,配置过程之中都是坑,下面就是总结的一写避坑指南.配置一次需要花费三四十分钟,配置错了还得重新配置,真的难受死了._vs2017+opencv+pcl

https://blog.csdn.net/m0_47489229/article/details/127156364

https://blog.csdn.net/m0_47489229/article/details/127156364在C:\Windows\System32\drivers\etc\hosts之中的hosts.txt文件的末尾增加一句151.101.56.133 raw.githubusercontent.com就可以了。这是我认为最简单和直接的方式,反正我在这一次性使用这个方式就配置好了,别的方法确实不好用。

接下来的重试过程同上,只不过我就没改后面的错误,配置过程只配置了OPENCV_EXTRA_MODULES_PATH与OPENCV_ENABLE_NONFREE,因为下半部分即便有错我不用了就可以了。BUILD_opencv_world我没有进行勾画对号,因为在使用的过程中,生成一个文件容易出错,后面大不了一个个配置就可以了。我想要的是Aruco配置,不是全部的配置。

出现错误就config,最后Generate。【我忘记了之前是咋配置成功的了,这就是个玄学】

https://img-blog.csdnimg.cn/direct/b3f3e82d66574bfc97dde1f33b1c154e.png

全部成功,经历大概半个小时。

https://img-blog.csdnimg.cn/direct/a54f46489ee348dc84dc6e43f127fcd8.png

install成功。

https://img-blog.csdnimg.cn/direct/98cbdf92cd0141f6952108cc9bcc8f9e.png

可以见到生成的install文件夹。配置Path环境变量。

C. Aruco配置

一. Aruco下载

aruco下载地址:ArUco download | SourceForge.netDownload ArUco for free. Augmented reality library based on OpenCV. ArUco is a minimal library for Augmented Reality applications based exclusively on OpenCV. Relies on b/w markers with codes that are detected by calling a single function.

https://sourceforge.net/projects/aruco/

https://sourceforge.net/projects/aruco/aruco生成官网:Online ArUco markers generatorGenerate ArUco marker for printing with dictionary selectionhttps://chev.me/arucogen/

aruco参考网址:

OpenCV: Detection of ArUco Markers

https://docs.opencv.org/4.5.4/d5/dae/tutorial_aruco_detection.html

https://docs.opencv.org/4.5.4/d5/dae/tutorial_aruco_detection.html解压与创建的文件夹:

https://img-blog.csdnimg.cn/direct/c69c5370e8f84a20b2ca526cd94f8b0f.png

二. Cmake配置

过程同上。

https://img-blog.csdnimg.cn/direct/76d4f424ef7b43b09db4612b5f47cc5c.png

特别注意:需要把OpenCV_DIR目录下的位置修改为opencv_build文件夹所在位置,

https://img-blog.csdnimg.cn/direct/4296f507a9ff4de9a20416ae6680b713.png


CMAKE_INSTALL_PREFIX的位置应该可以更改,我这里选择了默认位置

https://img-blog.csdnimg.cn/direct/bd5a1a2f368343cfa59d296c83d273b6.png

包含重新生成与安装的过程(经历一分钟)。

https://img-blog.csdnimg.cn/direct/6952f0ec84694ed6b159d6bb53527f82.png

安装的时候出错:

https://img-blog.csdnimg.cn/direct/08c99c25c9eb497c911c28c1e9e14b3f.png

看了一下安装路径:

https://img-blog.csdnimg.cn/direct/abf367437e36473ca95aa851cd23689b.png

不存在Aruco文档,说明放到C盘不合适。

我改到了D盘,成功生成。

https://img-blog.csdnimg.cn/direct/52a92771f7674a92a6ef1d0484f662c6.png

可以见到生成的aruco文档。

https://img-blog.csdnimg.cn/direct/e241512276d247c4a7477c7420a453d6.png

D. 开始项目的配置

一. 属性配置

https://img-blog.csdnimg.cn/direct/e904eef7cca04d1997c1772359b0c6c2.png

包含目录

D:\opencv4.6\aruco\include;
D:\opencv4.6\aruco\include\aruco;
D:\opencv4.6\opencv\newbuild\install\include;
D:\opencv4.6\opencv\newbuild\install\include\opencv2;
​​​​​​​$(IncludePath)

https://img-blog.csdnimg.cn/direct/2ce24cb7081f4d6fb382b3b74b397455.png

库目录

https://img-blog.csdnimg.cn/direct/7587d2dd201a476cb4894d9bdfe240dc.png

链接器->输入->附加依赖项:

https://img-blog.csdnimg.cn/direct/e2cd68f455c34f28a73e7b3d97ae72b3.png

这个地方由于没有集成,所以要进行完整的lib配置

找到下面的这个地方,输入cmd,执行dir /b *.lib *>0.txt命令,在当前文件夹中生成0.txt,将其内容复制粘贴到附加依赖项之中,删除不是lib结尾项,同时加入aruco的lib。

https://img-blog.csdnimg.cn/direct/f7c7ecb6da914bcc80608955c9021b4f.png

二. 代码测试



#include <iostream>  
#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>  
#include <opencv2/aruco/charuco.hpp>
#include "opencv2/imgproc.hpp"

using namespace cv;
using namespace std;

void maker_test(Mat image)
{

    cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_100);

    cv::Ptr<cv::aruco::DetectorParameters> params = aruco::DetectorParameters::create();
    params->cornerRefinementMethod = cv::aruco::CORNER_REFINE_NONE;

    cv::Mat imageCopy;

    image.copyTo(imageCopy);
    std::vector<int> ids;
    std::vector<std::vector<cv::Point2f>> corners, rejected;
    cv::aruco::detectMarkers(image, dictionary, corners, ids, params);


    // if at least one marker detected
    if (ids.size() > 0)
    {
        cv::aruco::drawDetectedMarkers(imageCopy, corners, ids);
        cv::resize(imageCopy, imageCopy,Size(4096/6,2160/6));
        cv::imshow("test", imageCopy);
        cv::waitKey();
    }

}

    int main()
    {
        Mat img = cv::imread("test.jpg", 1);
        maker_test(img);
    }

成功生成

https://img-blog.csdnimg.cn/direct/5a549bb341b24890a14801de86aa6930.png

https://img-blog.csdnimg.cn/direct/82217f7f30354ed4b82b760ab2b9c4ec.png

中间的蓝色框为想要的id


文章来源: https://blog.csdn.net/m0_47489229/article/details/135327623
版权声明: 本文为博主原创文章,遵循CC 4.0 BY-SA 知识共享协议,转载请附上原文出处链接和本声明。


...全文
183 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

6,202

社区成员

发帖
与我相关
我的任务
社区描述
微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。
windowsmicrosoft 企业社区
社区管理员
  • 微软技术分享
  • 郑子铭
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

微软技术社区为中国的开发者们提供一个技术干货传播平台,传递微软全球的技术和产品最新动态,分享各大技术方向的学习资源,同时也涵盖针对不同行业和场景的实践案例,希望可以全方位地帮助你获取更多知识和技能。

予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。

试试用AI创作助手写篇文章吧