opencv之利用gpu进行编程

news2024/11/24 6:29:26


很多朋友工作中会遇到需要使用gpu的例子,gpu就是显卡,大部分对gpu有个模糊的概念,即图像渲染会使用到他,但是它是如何生效的,又说不清楚。本篇文章主要介绍opencv下如何使用gpu进行编程。

基本介绍

opencv下存在gpu可以使用的函数接口,一般以cv::cuda:xxxx cv::cudacodec::等开头。cuda是nvidia公司提供的并行计算框架,也就是说opencv提供的cuda接口仅支持nvidia公司的显卡(个人理解)。至于其它gpu如何使用本篇不涉及。那我们有了nivida显卡,安装好了opencv库,是否就可以直接利用opencv提供的gpu函数进行操作了呢?答案是并不能,对于nivida显卡来说,有一块nivida显卡,安装好驱动仅仅是基础操作,还需要到nvidia官网下载对应的cuda包进行安装,还需要下载Video_Codec_SDK_11.1.5.zip包替换一些头文件才可以。下面会进行详细的介绍。

安装cuda

  1. 首先通过nvidia-smi命令查看显卡驱动支持的最高cuda版本。

consys@consys-Lenovo-Legion-Y7000:~$ nvidia-smi
Mon Sep 25 19:14:41 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.39       Driver Version: 460.39       CUDA Version: 11.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 1050    Off  | 00000000:01:00.0 Off |                  N/A |
| N/A   46C    P8    N/A /  N/A |      6MiB /  2000MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1214      G   /usr/lib/xorg/Xorg                  4MiB |
+-----------------------------------------------------------------------------+

 如上面引用所示,蓝色字体部分表示的是显卡驱动版本号,红色字体部分表示的是该显卡支持的最高cuda版本,我自己的显卡支持的cuda工具包最高版本号为11.2。

2.通过上面的命令查询到cuda版本号的最高版本号后,到NVIDIA官网下载符合要求的cuda工具包,官网截图如下:

 然后根据自己系统的特征下载对应的版本即可,选择方式如下,大家应该都懂,这里不再展开:

 这里更正一下,上图中选择runfile(local)即可。

下载后安装方式如下:

sudo sh cuda_11.1.1_455.32.00_linux.run

 执行上面的命令后,一步一步的顺序执行,需要注意的就是如果gpu已经安装了驱动就不需要再重新安装驱动了。安装完成后,在命令行中输入nvcc -V命令查询cuda工具包是否安装成功。

consys@consys-Lenovo-Legion-Y7000:~/桌面$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Tue_Sep_15_19:10:02_PDT_2020
Cuda compilation tools, release 11.1, V11.1.74
Build cuda_11.1.TC455_06.29069683_0

 如果出现上面的提示说明cuda工具包安装成功了。cuda工具包的安装路径在/usr/local/cuda-11.1

3.cuda工具包安装完成后需要通过配置才可以生效。配置方法如下:

vi /etc/profile

打开该配置文件后,在末尾添加:

export PATH=//usr/local/cuda-11.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH

通过source命令生效下该文件,但是soruce命令好像只能在该终端生效,该终端关闭后,这连个环境变量不会生效,为了永久生效,最好重启一下。

至此cuda工具包安装完成。

安装cuDNN

cuDNN适用于深度学习的,这里不再展开,感兴趣的朋友可以自行百度搜索相关文章。

安装Video_Codec_SDK工具包

下载地址:Video Codec SDK - Get Started | NVIDIA Developer

下载后解压缩文件,进入目录找到Read_Me.pdf文件,可以找到该sdk包对系统的要求,如下图所示:

 如果驱动版本版本不满足或者cuda工具包不满足要去,则现在低版本的nvidia-video-codec-sdk即可。

为什么要安装该SDK工具包呢?

其实在GPU驱动安装过程中,已经将nvidai-video-codec-sdk的库文件进行了安装,一般安装在/usr/lib/x86_64-linux-gnu/目录下,比如525.89.02版本的GPU驱动安装后,在/usr/lib/x86_64-linux-gnu/目录下存在libnvcuvid.so.525.89.02、libnvidia-encode.so.525.89.02的库文件。

 因此只需要头文件即可,通过如下命令将头文件拷贝至cuda工具包目录:

cp Video_Codec_SDK_11.1.5/Interface/* /usr/local/cuda/include/

 注:上述只用了nvidia-video-codec-sdk中的头文件,而没有使用nvidia-video-codec-sdk中的libnvcuvid.so、libnvidia-encode.so库,原因是在安装显卡驱动的时候会默认安装与驱动版本兼容的libnvcuvid.so、libnvidia-encode.so,而nvidia-video-codec-sdk中的库很可能与我们安装的显卡驱动版本不一致,如果使用了nvidia-video-codec-sdk中的libnvcuvid.so、ibnvidia-encode.so编译的时候,可能不会有问题,但是运行时很可能会因为与驱动版本不兼容而报错,因为,拒绝使用nvidia-video-codec-sdk中的libnvcuvid.so、ibnvidia-encode.so库。这个可谓是Nvidia的天坑,一定要注意

 如果没有这个步骤的话,编译opencv虽然不会发生错误,但是在再利用gpu编成的程序进行编译连接时会报错,错误信息如下:function/feature is not implement,the called functionality is disabled for current build or platform in function ‘throw_no_cuda’

参考连接:【AVD】Linux 编译支持 Cuda 的 OpenCV 4.6,解决报错 throw_no_cuda_深海Enoch的博客-CSDN博客

 安装ffmpeg

ffpmeg在opencv中的作用是什么呢?opencv依赖ffmpeg进行软解码,依赖nvidia-video-codec-sdk进行硬解码,如果未安装ffmpeg,那么opencv无法进行软解码,我的理解是无法读取视频文件或者拉流播放等工作。因此为了保证opencv既然软解码又能硬解码,ffmpeg和nvidia-video-codec-sdk都需要安装,nvidia-video-codec-sdk的安装在上一节已经介绍完毕,本届介绍如何安装ffmpeg。需要注意的是ffmpeg也提供了可以利用英伟达进行硬解码的方式,这样ffmpeg也可以利用英伟达显卡进行硬解码

安装ffmpeg的依赖项

sudo apt update
sudo apt install autoconf \
automake \
build-essential \
cmake \
git-core \
libass-dev \
libfreetype6-dev \
libgnutls28-dev \
libsdl2-dev \
libtool \
libva-dev \
libvdpau-dev \
libvorbis-dev \
libxcb1-dev \
libxcb-shm0-dev \
libxcb-xfixes0-dev \
pkg-config \
texinfo \
wget \
yasm \
zlib1g-dev

如果要在docker中编译ffmpeg nvidia硬解码,需要将在安装显卡驱动的时候安装的libnvcuvid.so、libnvidia-encode.so库,从宿主机拷贝到docker中,这两个库在宿主机的路径一般在/usr/lib/x86_64-linux-gnu/目录下,可提前将上述两个库拷贝至docker中,然后拷贝到docker的/lib64目录下,(一定要从宿主机目录进行拷贝,不要使用Video_Codec_SDK中的库,因为Video_Codec_SDK中的库很可能与本机安装的驱动不匹配,即便编译通过,但是运行时会出现驱动不兼容的问题)比如两个库是libnvcuvid.so.525.89.02、libnvidia-encode.so.525.89.02,在docker中操作如下:

cp libnvcuvid.so.525.89.02 /lib64/
cp libnvidia-encode.so.525.89.02 /lib64/
ln -s /lib64/libnvcuvid.so.525.89.02 /lib64/libnvcuvid.so.1
ln -s /lib64/libnvidia-encode.so.525.89.02 /lib64/libnvidia-encode.so.1
echo '/lib64' >> /etc/ld.so.conf
ldconfig

到github下载对应版本的ffmpeg即可。

特别需要注意的是ffmpeg提供了可操作英伟达显卡的头文件,下载命令如下:

git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git

下载完成后的目录是nv-codec-headers,截图如下:

 

从上面可以看到include目录中是一些头文件,头文件中是一些可以操作cuda工具包的函数,由此可以理解ffmpeg是利用cuda提供的api来实现对gpu的控制。

特别需要注意的是上图中的README文件中描述了该nv-codec-headers的依赖项:

nv-codec-headers安装方法:

cd nv-codec-headers && sudo make install

 编译ffmpeg的脚本如下:

#!/bin/bash
  
./configure --enable-nonfree --enable-cuda-nvcc --enable-libnpp --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --disable-static --enable-shared
 
make -j$(nproc)
 
sudo make install
 
echo '/usr/local/ffmpeg/lib' >> /etc/ld.so.conf
 
ldconfig

 上述执行完成后,测试ffmpeg硬件访问和cuvid解码器:

ffmpeg -hwaccels
ffmpeg -codecs | grep cuvid

测试结果如下:

consys@consys-Lenovo-Legion-Y7000:~$ ffmpeg -hwaccels
ffmpeg version 4.2.2-1kylin1k21.5 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9 (Ubuntu 9.3.0-10kylin2)
  configuration: --prefix=/usr --extra-version=1kylin1k21.5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
  WARNING: library configuration mismatch
  avcodec     configuration: --prefix=/usr --extra-version=1kylin1k21.5 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-nvenc --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libaribb24 --enable-liblensfun --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
Hardware acceleration methods:
vdpau
cuda
vaapi
drm
opencl
cuvid

ffmepg测试硬解码方法如下:

ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -extra_hw_frames 5 -i out.mp4 -c:a copy -c:v h264_nvenc -b:v 5M out1.mp4

上面的一些选项我也不太清楚,感兴趣的朋友可以自行研究下。上述的命令是输入一个mp4文件,然后输出一个mp4文件。

重新编译opencv

上面的步骤完成后,需要通过cmke-gui命令重新编译opencv,因为opencv默认编译时不会打开cuda相关选项,opencv有很多的编译选项,其中一部分跟cuda有关。

cmake打开opencv的界面如下,我通过关键字cuda进行了过滤:

通过上图可以看到WITH_CUDA,该选项一定要勾选;OPENCV_DNN_CUDA选项如果安装了cuDNN可以勾选;确认下CUDA_TOOLKIT_ROOT_DIR的路径是否正确,若与安装路径不一致,修改成cuda工具包的安装路径;CUDA_ARCH_BIN配置方法自行百度搜索。其它的勾选项与上面的一致就行了。

另外还有WITH_FFMPEG选项,这个一定要勾选上。

linux下opencv的编译方法可参考:Linux下OpenCV安装方法 - 知乎

按照上面连接的步骤点击cmake-gui上的Configure按钮,可以看到opencv下一些依赖项的配置信息,这里我们重点关注ffmpeg和NVIDIA的配置信息,其它类似,如下所示:

Video I/O:

DC1394: YES (2.2.5)

FFMPEG: YES

avcodec: YES (58.54.100)

avformat: YES (58.29.100)

avutil: YES (56.31.100)

swscale: YES (5.5.100)

avresample: NO

GStreamer: YES (1.16.2)

v4l/v4l2: YES (linux/videodev2.h)

NVIDIA CUDA: YES (ver 11.1, CUFFT CUBLAS NVCUVID FAST_MATH)

NVIDIA GPU arch: 35 37 50 52 60 61 70 75 80 86

NVIDIA PTX archs:

cuDNN: YES (ver 8.9.2)

上面的NVCUVID选项一定要有,否则无法通过opencv无法利用gpu进行硬解码会报错,报错信息我这里是:function/feature is not implement,the called functionality is disabled for current build or platform in function ‘throw_no_cuda’

关于docker下的一些错误可以参考下面的信息,我从别的地方拷贝过来的,没有经过验证,需要朋友们自行验证:

考虑是不是没有把libnvcuvid.so、libnvidia-encode.so追加到库的搜索路径路径下,一般docker环境中会出现这种问题,可从宿主机/usr/lib/x86_64-linux-gnu目录下拷贝上述的库(一定要从宿主机目录进行拷贝,不要使用Video_Codec_SDK中的库,因为Video_Codec_SDK中的库很可能与本机安装的驱动不匹配,即便编译通过,但是运行时会出现驱动不兼容的问题),比如libnvcuvid.so.525.89.02、libnvidia-encode.so.525.89.02拷贝到docker中的/usr/lib/x86_64-linux-gnu目录下,并创建软连接,创建软连接脚本如下:

 

#!/bin/bash
 
sopath=/usr/lib/x86_64-linux-gnu
 
if [ ! -L ${sopath}/libcuda.so ]; then
    files=(`find $sopath/libcuda.so*`)
    raw_so=${files[0]}
    echo Create soft link ${raw_so}
    ln -s ${raw_so} ${sopath}/libcuda.so
fi
 
if [ ! -L ${sopath}/libnvcuvid.so ]; then
    echo Create soft link ${sopath}/libnvcuvid.so.1
    ln -s ${sopath}/libnvcuvid.so.1 ${sopath}/libnvcuvid.so
fi
 
if [ ! -L ${sopath}/libnvidia-encode.so ]; then
    echo Create soft link ${sopath}/libnvidia-encode.so.1
    ln -s ${sopath}/libnvidia-encode.so.1 ${sopath}/libnvidia-encode.so
fi
ldconfig

 然后点击cmake-gui中的gennerate触发生成makefile文件。然后执行

make -j$(nproc)
 
make install

 opencv硬解码测试代码:

void MainWindow::playVideoByGpu()
{
    const std::string fname("rtsp://admin:consys123@192.168.0.64//Streaming/Channels/1");
    //cv::cuda::setGlDevice();
    cv::cuda::GpuMat d_frame;
    cv::cuda::GpuMat d_outFrame;
    cuda::Stream stream;
    cv::Ptr<cv::cudacodec::VideoReader> d_reader = cv::cudacodec::createVideoReader(fname);
    while(1)
    {
        if (!d_reader->nextFrame(d_frame))
            break;
        cuda::resize(d_frame,d_outFrame,Size(1920,1080));
        cv::Mat temp;

        d_outFrame.download(temp, stream);
        stream.waitForCompletion();
        cv::imshow("GPU", temp);
        if (cv::waitKey(30) > 0)
            break;
    }
}

但是有一点奇怪的是,在我的环境上使用gpu进行硬解码读取视频,然后在主线程调用imshow显示视频,并没有发现cpu占有率有明显下降,有知道原因的朋友可以给我留言,非常感谢!

参考连接:

OpenCV4.7.0、FFmpeg5.1 Nvidia GPU视频硬解码_opencv 硬解码_洪流之源的博客-CSDN博客

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

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

相关文章

软件测试:全链路追踪工具 Zipkin导入、安装(Windows版本)

1.0全链路追踪技术出现的原因 公司内部一个功能的实现&#xff0c;底层可能调用多个应用系统 在调用这个功能的同时&#xff0c;可能会出现多种情况&#xff0c;比如访问较慢&#xff0c;出现错误&#xff0c;可能需要进行定位 所以&#xff0c;我们需要快速定位服务错误点 大…

外汇天眼:SEC起诉“现金流之王”播客主持人涉嫌1100万美元庞氏骗局

美国证券交易委员会&#xff08;SEC&#xff09;今天指控了“现金流之王”播客主持人马修莫蒂尔&#xff0c;涉嫌通过一个庞氏骗局欺骗超过50名投资者&#xff0c;非法筹集了约1100万美元&#xff0c;涉及的票据据称由住宅物业支持。 根据SEC的投诉&#xff0c;俄亥俄州北奥尔姆…

openstack中通过主机mac地址查询主机id

问题&#xff1a; 客户给vm配置了子接口&#xff0c;并且接口上的ip可以ping通&#xff0c;客户需要从众多的主机中找到这台主机 解决办法 一 、通过子接口开放的端口让客户自行匹配自己业务进行查找 此处让客户自行查找即可 二 、通过数据库查找 注意&#xff1a;由于子接…

力扣:110. 平衡二叉树(Python3)

题目&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff…

课题学习(二)----倾角和方位角的动态测量方法(基于磁场的测量系统)

磁性测量工具安装在非磁性钻铤内&#xff0c;如图1&#xff0c;以避免磁性随钻测量工具测量时受到外部干扰。 测量系统采用三轴加速度计和三轴磁通门&#xff0c;并采用冗余设计&#xff0c;由于井下振动剧烈&#xff0c;陀螺仪的可靠性将大大降低。为了保证整个钻井过程中系统…

XC2028A CC/CV降压车充芯片,12V降5V,24V降5V,2.5A带限流功能的降压IC

XC2028A具有最佳输入电压、降压转换器&#xff0c;可在CV&#xff08;恒定输出电压&#xff09;模式或CC&#xff08;恒定输出电流&#xff09;模式下工作&#xff0c;OCP电流值由电流感应电阻设置。最大输入电压高达32V&#xff0c;MOSFET&#xff0c;什么是建立在50mΩ高侧和…

搭建BP神经网络

1.数据集下载 2.C语言代码 BP.h #ifndef BP_H_INCLUDED #define BP_H_INCLUDED const int INPUT_LAYER 784; //输入层维度 const int HIDDEN_LAYER 40; //隐含层维度 const int OUTPUT_LAYER 10; //输出层维度 const double LEARN_RATE 0.3; //学习率 const int TRAIN_TIM…

Sringcloud:一、微服务介绍+常用技术框架和技术对比+服务拆分demo

微服务介绍 单体架构 简介 将业务所有功能集中在一个项目中开发&#xff0c;打成一个包部署优点 架构简单部署成本低 缺点 耦合度高&#xff0c;不利于后续更新迭代 分布式架构 简介 每个业务模块作为一个独立项目开发&#xff0c;称为一个服务&#xff0c;但通常仍共用一…

Spark集成ClickHouse(笔记)

目录 前言&#xff1a; 一.配置环境 1.安装clickhouse驱动 2.配置clickhouse环境 二.spark 集成clickhouse 直接上代码&#xff0c;里面有一些注释哦&#xff01; 前言&#xff1a; 在大数据处理和分析领域&#xff0c;Spark 是一个非常强大且广泛使用的开源分布式计算框架…

从想象力到生产力,VR全景技术让亚运会走进你的身边

杭州亚运会开幕&#xff0c;各方面氛围感直接拉满&#xff0c;既是一场体育盛会&#xff0c;也是一场科技盛宴&#xff0c;VR技术也融入了亚运会的方方面面。在5G技术的加持下&#xff0c;VR全景技术可以将亚运会各项赛事提升到一个很高的水平&#xff0c;观众即使不在现场&…

【医疗图像处理软件】重要功能集合

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 一起挑战150岁生命线&#xff01; 前言之前&#xff1a;从事医疗器械行业使我们更加关注自己的健康&#xff0c;每天看着髋膝关节置换的手术视频&#xff0c;我们会更加爱护自己的膝盖。同…

给你两个集合,要求{A} + {B}

先看题&#xff1a; 看完题后你会觉得&#xff1a;哇&#xff0c;好简单&#xff0c;STL一下就出来啦。 #include <iostream> #include <set>using namespace std;int main() {int n, m;while (cin >> n >> m) {set<int> set_a;for (int i 0;…

第二证券:造谣?判了!有人少花四五万!美元突破近10个月高位

当地时间9月25日&#xff08;周一&#xff09;&#xff0c;美国三大股指停步四连跌。纳斯达克我国金龙指数跌1.1%&#xff0c;抱负轿车跌近10%。蔚来跌幅明显收窄&#xff0c;盘终跌超2%。美元指数一度升破106关口&#xff0c;刷新上一年11月底以来的10个月最高&#xff0c;此前…

Qt扫盲-QSqlQueryModel理论总结

QSqlQueryModel理论总结 一、概述二、使用1. 与 view 视图 绑定2. 分离视图&#xff0c;只存数据 一、概述 QSqlQueryModel是用于执行SQL语句和遍历结果集的高级接口。它构建在较低级的 QSqlQuery之上&#xff0c;可用于向QTableView 等视图类提供数据&#xff0c;也是使用了Q…

中国大模型的路,是不是走歪了?

大数据产业创新服务媒体 ——聚焦数据 改变商业 在这波全球大模型的浪潮中&#xff0c;中国与美国无疑成为了领军者。但中美在大模型的发展策略上却出现了显著的分歧。美国&#xff0c;以OpenAI为代表&#xff0c;持续致力于通用型大模型的研发。与此相反&#xff0c;中国则将…

著名数字音频工作站FL Studio 21.0.3.3517中文破解安装图文激活教程

在一个技术继续塑造我们日常生活的世界里&#xff0c;创造力找到了表达自己的新渠道。FL Studio 21成为一个强大的工具&#xff0c;使个人能够创作自己的音乐杰作。一个人需要广泛的乐器知识或一个成熟的工作室来创作交响乐的日子已经一去不复返了。有了FL Studio 21&#xff0…

MySQL作业:索引、视图、存储、函数

学生表&#xff1a;Student (Sno, Sname, Sex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score) …

【响应式布局】

响应式布局 1 什么是响应式布局2 响应式布局的5种实现方案2.1 百分比布局2.2 媒体查询布局2.3 rem响应式布局2.4 vw / vh响应式布局2.5 flex弹性布局 1 什么是响应式布局 响应式布局就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。这个概念是为解决移动互…

地球的某一片红薯地中秋圆《乡村振兴战略下传统村落文化旅游设计》——旅行季许少辉八月新书辉少许想象和世界一样宽广

地球的某一片红薯地中秋圆《乡村振兴战略下传统村落文化旅游设计》——旅行季许少辉八月新书辉少许想象和世界一样宽广 地球的某一片红薯地中秋圆《乡村振兴战略下传统村落文化旅游设计》——旅行季许少辉八月新书辉少许想象和世界一样宽广]