ubuntu 通过 海康sdk调用摄像头抓图片

https://blog.csdn.net/ding977921830/article/details/75272384

在本文中我的电脑是使用的Ubuntu16.04 64位,使用工具是QT5.7.1,opencv2.4.9.
一、根据电脑的型号下载海康威视的SDK包
网址:http://www.hikvision.com/cn/download_61.html。
我的笔记本时linux64位的,所以下载的 ————设备网络SDK_Linux64 
二、 用下面的方法之一配置SDK
如果HCNetSDKCom目录以及libhcnetsdk.so、libhpr.so、libHCCore文件和可执行文件在同一级目录下,则使用同级目录下的库文件; 
如果不在同一级目录下,则需要将以上文件的目录加载到动态库搜索路径中,设置的方式有以下几种: 
1.    将网络SDK各动态库路径加入到LD_LIBRARY_PATH环境变量 
    1.在终端输入:export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX:/XXX/HCNetSDKCom      只在当前终端起作用
    2. 修改~/.bashrc或~/.bash_profile,最后一行添加 export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/XXX:/XXX/HCNetSDKCom,保存之后,使用source  .bashrc执行该文件 ,当前用户生效
    3. 修改/etc/profile,添加内容如第2条,同样保存之后使用source执行该文件  所有用户生效 
 

2.在/etc/ld.so.conf文件结尾添加网络sdk库的路径,如/XXX和/XXX/HCNetSDKCom/,保存之后,然后执行ldconfig。

三. 在Ubuntu16.04 的qt中新建一个工程
1.  在工程的 ×.pro文件中添加以下内容:

[plain] view plaincopy
  1. INCLUDEPATH += /usr/local/include \  
  2. /usr/local/include/opencv \  
  3. /usr/local/include/opencv2  
  4.   
  5. LIBS += /usr/local/lib/libopencv_calib3d.so\  
  6.         /usr/local/lib/libopencv_ml.so.2.4.9\  
  7.         /usr/local/lib/libopencv_calib3d.so.2.4 \  
  8.         /usr/local/lib/libopencv_nonfree.so\  
  9.         /usr/local/lib/libopencv_calib3d.so.2.4.9  \  
  10.         /usr/local/lib/libopencv_nonfree.so.2.4\  
  11.         /usr/local/lib/libopencv_contrib.so    \  
  12.         /usr/local/lib/libopencv_nonfree.so.2.4.9\  
  13.         /usr/local/lib/libopencv_contrib.so.2.4    \  
  14.         /usr/local/lib/libopencv_objdetect.so\  
  15.         /usr/local/lib/libopencv_contrib.so.2.4.9 \  
  16.         /usr/local/lib/libopencv_objdetect.so.2.4\  
  17.         /usr/local/lib/libopencv_core.so\  
  18.         /usr/local/lib/libopencv_objdetect.so.2.4.9\  
  19.         /usr/local/lib/libopencv_core.so.2.4 \  
  20.         /usr/local/lib/libopencv_ocl.so\  
  21.         /usr/local/lib/libopencv_core.so.2.4.9 \  
  22.         /usr/local/lib/libopencv_ocl.so.2.4\  
  23.         /usr/local/lib/libopencv_features2d.so \  
  24.         /usr/local/lib/libopencv_ocl.so.2.4.9\  
  25.         /usr/local/lib/libopencv_features2d.so.2.4  \  
  26.         /usr/local/lib/libopencv_photo.so\  
  27.         /usr/local/lib/libopencv_features2d.so.2.4.9 \  
  28.         /usr/local/lib/libopencv_photo.so.2.4\  
  29.         /usr/local/lib/libopencv_flann.so  \  
  30.         /usr/local/lib/libopencv_photo.so.2.4.9\  
  31.         /usr/local/lib/libopencv_flann.so.2.4   \  
  32.         /usr/local/lib/libopencv_stitching.so\  
  33.         /usr/local/lib/libopencv_flann.so.2.4.9  \  
  34.         /usr/local/lib/libopencv_stitching.so.2.4\  
  35.         /usr/local/lib/libopencv_gpu.so     \  
  36.         /usr/local/lib/libopencv_stitching.so.2.4.9\  
  37.         /usr/local/lib/libopencv_gpu.so.2.4   \  
  38.         /usr/local/lib/libopencv_superres.so\  
  39.         /usr/local/lib/libopencv_gpu.so.2.4.9 \  
  40.         /usr/local/lib/libopencv_superres.so.2.4\  
  41.         /usr/local/lib/libopencv_highgui.so   \  
  42.         /usr/local/lib/libopencv_superres.so.2.4.9\  
  43.         /usr/local/lib/libopencv_highgui.so.2.4   \  
  44.         /usr/local/lib/libopencv_highgui.so.2.4.9 \  
  45.         /usr/local/lib/libopencv_video.so\  
  46.         /usr/local/lib/libopencv_imgproc.so  \  
  47.         /usr/local/lib/libopencv_video.so.2.4\  
  48.         /usr/local/lib/libopencv_imgproc.so.2.4 \  
  49.         /usr/local/lib/libopencv_video.so.2.4.9\  
  50.         /usr/local/lib/libopencv_imgproc.so.2.4.9\  
  51.         /usr/local/lib/libopencv_videostab.so\  
  52.         /usr/local/lib/libopencv_legacy.so \  
  53.         /usr/local/lib/libopencv_videostab.so.2.4\  
  54.         /usr/local/lib/libopencv_legacy.so.2.4  \  
  55.         /usr/local/lib/libopencv_videostab.so.2.4.9\  
  56.         /usr/local/lib/libopencv_legacy.so.2.4.9  \  
  57.         /usr/local/lib/libopencv_ml.so  
  58.   
  59. INCLUDEPATH += /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/incCn  
  60.   
  61.   
  62. LIBS += /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libhcnetsdk.so\  
  63.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libHCCore.so\  
  64.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libhpr.so\  
  65.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libPlayCtrl.so\  
  66.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libSuperRender.so\  
  67.         /home/ding/opencv_projects/CH_HCNetSDK_V5.2.7.4_build20170606_Linux64/lib/libAudioRender.so  
2. 在main.cpp函数中添加以下内容:

[cpp] view plaincopy
  1. #include "opencv2/opencv.hpp"  
  2.   
  3. #include <QDir>  
  4. #include <fstream>  
  5. #include <unistd.h>  
  6. //#include "auto_entercs.h"  
  7.   
  8. #include "HCNetSDK.h"  
  9. #include "PlayM4.h"  
  10. #include "LinuxPlayM4.h"  
  11.   
  12. #define HPR_ERROR       -1  
  13. #define HPR_OK               0  
  14. #define USECOLOR          0  
  15.   
  16. static cv::Mat dst;  
  17. HWND h = NULL;  
  18. LONG nPort=-1;  
  19. LONG lUserID;  
  20.   
  21. pthread_mutex_t mutex;  
  22. std::list<cv::Mat> g_frameList;  
  23.   
  24.   
  25. FILE *g_pFile = NULL;  
  26.   
  27. void CALLBACK PsDataCallBack(LONG lRealHandle, DWORD dwDataType,BYTE *pPacketBuffer,DWORD nPacketSize, void* pUser)  
  28. {  
  29.   
  30.    if (dwDataType  == NET_DVR_SYSHEAD)  
  31.    {  
  32.        //写入头数据  
  33.        g_pFile = fopen("/home/lds/source/ps.dat""wb");  
  34.   
  35.        if (g_pFile == NULL)  
  36.        {  
  37.            printf("CreateFileHead fail\n");  
  38.            return;  
  39.        }  
  40.   
  41.        //写入头数据  
  42.        fwrite(pPacketBuffer, sizeof(unsigned char), nPacketSize, g_pFile);  
  43.        printf("write head len=%d\n", nPacketSize);  
  44.    }  
  45.    else  
  46.    {  
  47.        if(g_pFile != NULL)  
  48.        {  
  49.            fwrite(pPacketBuffer, sizeof(unsigned char), nPacketSize, g_pFile);  
  50.            printf("write data len=%d\n", nPacketSize);  
  51.        }  
  52.    }  
  53.   
  54. }  
  55.   
  56. //void CALLBACK DecCBFun(LONG nPort, char *pBuf, LONG nSize, FRAME_INFO *pFrameInfo, LONG nReserved1, LONG nReserved2)  
  57. void CALLBACK DecCBFun(LONG nPort, char *pBuf, LONG nSize, FRAME_INFO *pFrameInfo, void* nReserved1, LONG nReserved2)  
  58. {  
  59.    long lFrameType = pFrameInfo->nType;  
  60.   
  61.      if (lFrameType == T_YV12)  
  62.      {  
  63.       //cv::Mat dst(pFrameInfo->nHeight, pFrameInfo->nWidth,  
  64.       //            CV_8UC3);  // 8UC3表示8bit uchar无符号类型,3通道值  
  65.            dst.create(pFrameInfo->nHeight, pFrameInfo->nWidth,  
  66.                  CV_8UC3);  
  67.   
  68.            cv::Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (uchar *)pBuf);  
  69.            cv::cvtColor(src, dst, CV_YUV2BGR_YV12);  
  70.            pthread_mutex_lock(&mutex);  
  71.            g_frameList.push_back(dst);  
  72.            pthread_mutex_unlock(&mutex);  
  73.      }  
  74.     usleep(1000);  
  75.   
  76.    //cv::Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, (uchar *)pBuf);  
  77.    //cv::cvtColor(src, dst, CV_YUV2BGR_YV12);  
  78.    //cv::imshow("bgr", dst);  
  79.    //pthread_mutex_lock(&mutex);  
  80.    //g_frameList.push_back(dst);  
  81.    //pthread_mutex_unlock(&mutex);  
  82.    //vw << dst;  
  83.    //cv::waitKey(10);  
  84.   
  85. }  
  86.   
  87. void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize,void* dwUser)  
  88. {  
  89.    /* 
  90.    if (dwDataType == 1) 
  91.    { 
  92.        PlayM4_GetPort(&nPort); 
  93.        PlayM4_SetStreamOpenMode(nPort, STREAME_REALTIME); 
  94.        PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024 * 1024); 
  95.        PlayM4_SetDecCallBackEx(nPort, DecCBFun, NULL, NULL); 
  96.        PlayM4_Play(nPort, h); 
  97.    } 
  98.    else 
  99.    { 
  100.        BOOL inData = PlayM4_InputData(nPort, pBuffer, dwBufSize); 
  101.    }*/  
  102.    DWORD dRet;  
  103.    switch (dwDataType)  
  104.    {  
  105.      case NET_DVR_SYSHEAD:           //系统头  
  106.        if (!PlayM4_GetPort(&nPort))  //获取播放库未使用的通道号  
  107.        {  
  108.          break;  
  109.        }  
  110.        if (dwBufSize > 0) {  
  111.          if (!PlayM4_SetStreamOpenMode(nPort, STREAME_REALTIME)) {  
  112.            dRet = PlayM4_GetLastError(nPort);  
  113.            break;  
  114.          }  
  115.          if (!PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024 * 1024)) {  
  116.            dRet = PlayM4_GetLastError(nPort);  
  117.            break;  
  118.          }  
  119.          //设置解码回调函数 只解码不显示  
  120.         //  if (!PlayM4_SetDecCallBack(nPort, DecCBFun)) {  
  121.         //     dRet = PlayM4_GetLastError(nPort);  
  122.         //     break;  
  123.         //  }  
  124.   
  125.          //设置解码回调函数 解码且显示  
  126.          if (!PlayM4_SetDecCallBackEx(nPort, DecCBFun, NULL, NULL))  
  127.          {  
  128.            dRet = PlayM4_GetLastError(nPort);  
  129.            break;  
  130.          }  
  131.   
  132.          //打开视频解码  
  133.          if (!PlayM4_Play(nPort, h))  
  134.          {  
  135.            dRet = PlayM4_GetLastError(nPort);  
  136.            break;  
  137.          }  
  138.   
  139.          //打开音频解码, 需要码流是复合流  
  140.          if (!PlayM4_PlaySound(nPort)) {  
  141.            dRet = PlayM4_GetLastError(nPort);  
  142.            break;  
  143.          }  
  144.        }  
  145.        break;  
  146.        //usleep(500);  
  147.      case NET_DVR_STREAMDATA:  //码流数据  
  148.        if (dwBufSize > 0 && nPort != -1) {  
  149.          BOOL inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);  
  150.          while (!inData) {  
  151.            sleep(100);  
  152.            inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);  
  153.            std::cerr << "PlayM4_InputData failed \n" << std::endl;  
  154.          }  
  155.        }  
  156.        break;  
  157.    }  
  158. }  
  159.   
  160. void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)  
  161. {  
  162.    char tempbuf[256] = {0};  
  163.    std::cout << "EXCEPTION_RECONNECT = " << EXCEPTION_RECONNECT << std::endl;  
  164.    switch(dwType)  
  165.    {  
  166.    case EXCEPTION_RECONNECT:    //预览时重连  
  167.        printf("pyd----------reconnect--------%d\n", time(NULL));  
  168.        break;  
  169.    default:  
  170.        break;  
  171.    }  
  172. }  
  173.   
  174. void *RunIPCameraInfo(void *)  
  175. {  
  176.    char IP[]         = "192.168.**.***";   //海康威视网络摄像头的ip  
  177.    char UName[] = "****";                 //海康威视网络摄像头的用户名  
  178.    char PSW[]      = "*****";           //海康威视网络摄像头的密码  
  179.    NET_DVR_Init();  
  180.    NET_DVR_SetConnectTime(2000, 1);  
  181.    NET_DVR_SetReconnect(1000, true);  
  182.    NET_DVR_SetLogToFile(3, "./sdkLog");  
  183.    NET_DVR_DEVICEINFO_V30 struDeviceInfo = {0};  
  184.    NET_DVR_SetRecvTimeOut(5000);  
  185.    lUserID = NET_DVR_Login_V30(IP, 8000, UName, PSW, &struDeviceInfo);  
  186.   
  187.    NET_DVR_SetExceptionCallBack_V30(0, NULL, g_ExceptionCallBack, NULL);  
  188.   
  189.    long lRealPlayHandle;  
  190.    NET_DVR_CLIENTINFO ClientInfo = {0};  
  191.   
  192.    ClientInfo.lChannel       = 1;  
  193.    ClientInfo.lLinkMode     = 0;  
  194.    ClientInfo.hPlayWnd     = 0;  
  195.    ClientInfo.sMultiCastIP = NULL;  
  196.   
  197.   
  198.    //lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, PsDataCallBack, NULL, 0);  
  199.    lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, g_RealDataCallBack_V30, NULL, 0);  
  200.    //NET_DVR_SaveRealData(lRealPlayHandle, "/home/lds/source/yuntai.mp4");  
  201.    if (lRealPlayHandle < 0)  
  202.    {  
  203.        printf("pyd1---NET_DVR_RealPlay_V30 error\n");  
  204.    }  
  205.    sleep(-1);  
  206.   
  207.    NET_DVR_Cleanup();  
  208. }  
  209.   
  210. int main(int argc, char *argv[])  
  211. {  
  212.   
  213.    pthread_t getframe;  
  214.   
  215.    pthread_mutex_init(&mutex, NULL);  
  216.    int ret;  
  217.   
  218.    ret = pthread_create(&getframe, NULL, RunIPCameraInfo, NULL);  
  219.   
  220.   
  221.    if(ret!=0)  
  222.    {  
  223.        printf("Create pthread error!\n");  
  224.    }  
  225.   
  226.    cv::Mat image;  
  227.    while(1)  
  228.    {  
  229.        pthread_mutex_lock(&mutex);  
  230.        if(g_frameList.size())  
  231.        {  
  232.            std::list<cv::Mat>::iterator it;  
  233.            it = g_frameList.end();  
  234.            it--;  
  235.            image = (*(it));  
  236.            if (!image.empty())  
  237.            {  
  238.                imshow("frame from camera",image);  
  239.                cv::waitKey(1);  
  240.            }  
  241.            g_frameList.pop_front();  
  242.        }  
  243.        g_frameList.clear(); // 丢掉旧的帧  
  244.        pthread_mutex_unlock(&mutex);  
  245.    }  
  246.   
  247.    return 0;  
  248. }  

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

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

相关文章

程序员与「中台」的爱恨交错

大家好&#xff0c;我是Z哥。这篇文章比较长&#xff0c;有5200字&#xff0c;不过希望你能耐心看完&#xff0c;特别是程序员。中台这个词&#xff0c;最近两年特别火&#xff0c;它的爆发源于2015年张勇在阿里发出的内部信中提到的“大中台&#xff0c;小前台”战略。随后吸引…

ubuntu 文件管理器死机

有时会遇到Ubuntu文件管理器死掉的情况&#xff0c;怎么点击都没有反应&#xff0c;这时只需在终端上运行ps -A | grep nautilus&#xff0c;查找文件管理器nautilus对应的pid,然后sudokillpid就可以关闭文件管理器进程&#xff0c;随便点击一个文件夹就可以重启文件管理器了。…

「云」发展的怎么样了?

周五发了一篇聊中台的文章&#xff0c;《》。有小伙伴给我留言问到&#xff0c;身边好像直接基于「云」做开发的人和企业越来越多了&#xff0c;如何看待「云」的渗透率逐渐走高对我们技术人的影响。对于这点我的观点是&#xff0c;一件事情分工越来越细是我们整个社会向前发展…

ML.NET 1.4 发布,跨平台机器学习框架

ML.NET 是一个面向 .NET 开发人员的开源和跨平台机器学习框架&#xff0c;它包括 Model Builder 和 CLI(命令行接口)&#xff0c;让使用自动机器学习(AutoML)构建自定义机器学习模型变得更容易。1.4 版本已经发布了&#xff0c;以下是本次更新的一些亮点&#xff1a;基于 GPU 支…

安装distro ./test.sh 找不到路径

https://github.com/torch/distro ./test.sh 显示找不到path&#xff0c; 需要我们在./update.sh之后 source /root/.bashrc

使用ASP.NET Core 3.x 构建 RESTful API - 2. 什么是RESTful API

1. 使用ASP.NET Core 3.x 构建 RESTful API - 1.准备工作什么是REST REST一词最早是在2000年&#xff0c;由Roy Fielding在他的博士论文《Architectural Styles and the Design of Network-based Software Architecture》中提出的。他在本文中创造了REST这个术语。这篇论文的地…

Ubuntu 安装 cuda deb 指令 不要自动装9.2

比如安装 9.0 sudo dpkg -i cuda-repo-ubuntu1604-9-0-local_9.0.148-1_amd64.deb sudo apt-key add /var/cuda-repo-9-0-local/7fa2af80.pub sudo apt-get update sudo apt-get install cuda 最后一句会自动安装9.2 需要改为&#xff1a; sudo apt-get install cuda-9.0

Visual Studio Online 的 FAQ:iPad 支持、自托管环境、Azure 账号等

iPad 支持 目前&#xff0c;Web 版 VS Code 只支持基于 Chromium 的浏览器&#xff0c;还不支持 iPad 上的浏览器。但对于 Safari 的支持&#xff0c;是 Visual Studio Online 团队的一件高优先级的任务。更多详情&#xff0c;可以关注&#xff1a; https://github.com/Microso…

2019 .NET China Conf之我逛魔都

趁着参加首届.NET开发者峰会之际&#xff0c;我也是第一次到上海&#xff0c;因此也趁机逛了一下大魔都&#xff0c;和你分享一波我在魔都拍的照片组。酒店所在地&#xff1a;邮电新村地铁站附近为何选择这里&#xff1f;因为离会场酒店6个地铁站&#xff0c;离南京东路和外滩半…

[object detection] TypeError: can't pickle dict_values objects

https://github.com/tensorflow/models/issues/4780 If youre using python3 , add list() to category_index.values() in model_lib.py about line 381 as this list(category_index.values()).

参加首届中国 .NET 开发者峰会有感

参加首届中国 .NET 开发者峰会有感Intro很高兴能够有机会参加首届中国 .NET 开发者峰会&#xff0c;与从全国各地赶来上海参加活动的 .NETer 一起参与这空前的 .NET 的盛会。大会有许多从外地过来参加的开发者们&#xff0c;也有些讲师也是从外地赶过来为我们分享&#xff0c;特…

推荐一款神器-VBAC#代码编辑管理器

网名&#xff1a;liucqa&#xff0c;OFFICE开发领域真大牛&#xff0c;比ExcelHome所有版主和所有出OFFICE开发类书籍的人都要牛的人&#xff0c;出品了它的大作&#xff0c;给大家推荐使用。特色功能&#xff1a;C#&VBA代码格式化/代码收藏/高亮语法详细介绍说明如下&…

mmdnn cannot import caffe

export PYTHONPATH/path/to/your/pycaffe:$PYTHONPATH

【.NET Core 3.0】 46 ║ 授权认证:自定义返回格式

前言哈喽大家好&#xff0c;马上就要年末了&#xff0c;距离新的一年&#xff0c;只有50天了&#xff0c;春节是75天。在这个时节内&#xff0c;天气逐渐变凉&#xff0c;但是大家的心肯定很热吧&#xff0c;因为发生了两件大事&#xff1a;1、双十一买买买&#xff0c;在这个让…

mmdnn TensorFlow is outdated

不仅要更新 tf 还要 python import tensorflow as tf print(tf.__path__) 将其export 到PYTHONPATH当中

.NET Core 如何生成真正的ICO图标

点击上方蓝字关注“汪宇杰博客”导语前一阵我终于完成了博客系统动态生成favicon的功能。众所周知&#xff0c;favicon肯定有一个ico格式的图标&#xff0c;其余可以用 png manifest 的方式输出。然而这个ICO格式让我小收福报&#xff0c;今天就给大家分享一下解决办法。.NET自…

error: ‘CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD’ was not declared in this scope

cudnn版本问题 cuda8.0cudnn5.1可取 还应修改 Makefile.config当中cuda的路径

Visual Studio Online 东半球首秀,亮相 .NET Conf 2019 中国峰会

佷高兴能参加 .NET Conf 并演讲。看到 NET 社区这么活跃&#xff0c;也是非常开心&#xff01;这次我演讲的主题是《Visual Studio Code —— .NET 开发利器》。找找我在哪&#xff1f;更多关于 Visual Studio Online 的四种开发模式&#xff0c;可以阅读这篇文章&#xff1a;最…

mmdnn tensorflow 转 caffe

参考 https://github.com/Microsoft/MMdnn/blob/master/mmdnn/conversion/tensorflow/README.md#how-to-prepare-your-model-and-conversion-parameters 查看可用模型&#xff1a; How to prepare your model and conversion parameters You can refer Slim Model Extracto…

.NET Core 3.0 部署在docker上运行

自从.NET Core3.0发布之后&#xff0c;写了几篇关于.NET Core 3.0的文章&#xff0c;有助于你快速入门.NET Core3.0。本篇文章主要讲解如何一步步创建一个mvc项目&#xff0c;然后发布并部署在Docker上运行。需要你本地有docker环境1.创建一个站点创建一个ASP.NET Core Web应用…