【VM服务管家】VM4.x算子SDK开发_3.2 公用工具类

目录

  • 3.2.1 图像载入:本地图像的载入方法
  • 3.2.2 相机取流:相机SDK取流的方法
  • 3.2.3 输入图像:给算子模块输入图像数据的方法
  • 3.2.4 实时取流:实时取流的实现方法
  • 3.2.5 卡尺ROI:卡尺型ROI的生成方法
  • 3.2.6 DL算子耗时:深度学习算子长时间停止再运行耗时变长问题的解决方法

3.2.1 图像载入:本地图像的载入方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:彩色图像如何载入?
解答
示例代码如下:
一、彩色图像的载入

1.	C#
2.	 
3.	CMvdImage cMvdImage = new CMvdImage();
4.	cMvdImage.InitImage(ImagePathStr,MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3);

二、灰度图像的载入

1.	C#
2.	 
3.	CMvdImage cMvdImage = new CMvdImage();
4.	cMvdImage.InitImage(ImagePathStr,MVD_PIXEL_FORMAT.MVD_PIXELMONO_08);

问题根因
不熟悉彩色图像的像素格式。
提示
如果原图像素格式为BGR,需要转换通道灰度值,再调用上述像素格式。其它接口,例如MVD_PIXEL_RGB_BGR24_C3等不可使用。

3.2.2 相机取流:相机SDK取流的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:如何使用相机SDK取流?
解答
可以通过调用相机SDK来实现相机取流。
1.截取相机帧数据。示例代码如下。

1.	C#
2.	//相机相关变量
3.	private VisionDesigner.Camera.CCameraTool m_cMyCameraToolObj = null;
4.	 
5.	/// <summary>
6.	/// 打开相机并开始取图
7.	/// </summary>
8.	public int OpenCamera(int cameraindex = 0)
9.	{
10.	    try
11.	    {
12.	        //DeviceListAcq();//获取相机列表方法
13.	        //创建相机算子实例
14.	        if (null == m_cMyCameraToolObj)
15.	        {
16.	            m_cMyCameraToolObj = new VisionDesigner.Camera.CCameraTool();
17.	            if (null == m_cMyCameraToolObj)
18.	            {
19.	                return -1;
20.	            }
21.	        }
22.	        //设置连续采集模式
23.	        m_cMyCameraToolObj.SelectDevice(cameraindex);//默认选择索引为0的相机
24.	        m_cMyCameraToolObj.OpenDevice();
25.	        m_cMyCameraToolObj.SetEnumValue("AcquisitionMode", (uint)MVD_CAM_ACQUISITION_MODE.MVD_ACQ_MODE_CONTINUOUS);
26.	        m_cMyCameraToolObj.SetEnumValue("TriggerMode", (uint)MVD_CAM_TRIGGER_MODE.MVD_TRIGGER_MODE_OFF);
27.	        m_cMyCameraToolObj.SetEnumValue("TriggerSource", (uint)MVD_CAM_TRIGGER_SOURCE.MVD_TRIGGER_SOURCE_SOFTWARE);
28.	        m_cMyCameraToolObj.StartGrab();//开始取图
29.	        return 0;
30.	    }
31.	    catch (Exception ex)
32.	    {
33.	        return -1;
34.	    }
35.	}
36.	/// <summary>
37.	/// 从相机获取一帧图像
38.	/// </summary>
39.	private void GetStreamThreadProc()
40.	{
41.	    int nRet = 0;
42.	    CMvdImage imgtemp = null;
43.	    nRet = 0;
44.	    nRet = m_cMyCameraToolObj.CameraGrabResult.GetOneFrameTimeout (ref imgtemp);
45.	    if (0 == nRet && imgtemp != null)
46.	    {
47.	        ImageData imageshow1 = CMvdImageToImageData(imgtemp);
48.	     }
49.	}

2.将相机帧类型CMvdImage图像数据转换成ImageData类型数据,代码如下。

50. C#
51. 	
52.	/// <summary>
53.	/// CMvdImage格式的图像转为imagedata图像
54.	/// </summary>
55.	/// <param name="image"></param>
56.	/// <returns></returns>
57.	public ImageData CMvdImageToImageData(CMvdImage image)
58.	{
59.	    if (image != null)
60.	    {
61.	        ImageData imageData = new ImageData();
62.	        imageData.Width = (int)image.Width;
63.	        imageData.Height = (int)image.Height;
64.	        imageData.PixelFormat = PixelFormats.Gray8;
65.	        imageData.ImageBuffer = new byte[image.GetImageData(0).arrDataBytes.Length];
66.	        Array.Copy(image.GetImageData(0).arrDataBytes, imageData.ImageBuffer, imageData.ImageBuffer.Length);
67.	        return imageData;
68.	    }
69.	    else
70.	    {
71.	        return null;
72.	    }
73.	}

问题根因
不熟悉相机SDK及其接口。

3.2.3 输入图像:给算子模块输入图像数据的方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:如何通过图像数据给算子模块输入图像?
解答
以字符识别算子模块为例,代码如下所示,分为c++和c#。

//C++
//设置输入图像
int width = 2048;   //图像宽度
int height = 2024;  //图像高度
unsigned char* data = new unsigned char[2048*2024];
memset(data, '0', 2048 * 2024);//内存中图像数据

MVD_IMAGE_DATA_INFO stImageData;
stImageData.stDataChannel[0].pData = data;
stImageData.stDataChannel[0].nRowStep = width;
stImageData.stDataChannel[0].nSize = width * height;
stImageData.stDataChannel[0].nLen = width * height;
MVD_PIXEL_FORMAT pixelFormat = MVD_PIXEL_MONO_08;   //灰度图

IMvdImage* pInputImage = NULL;
CreateImageInstance(&pInputImage);
pInputImage->InitImage(width, height , pixelFormat, stImageData); //加载内存图像的唯一方法,SetPrivateData/SetPixel均不能使用
//字符识别算子
IOCRSegmenter* pOCRSegmentTool = NULL;
CreateOCRSegmenterInstance(&pOCRSegmentTool);
pOCRSegmentTool->SetInputImage(pInputImage);

//c#
//设置输入图像
uint width = 2048;
uint height = 2024;
byte[] data = new byte[2048 * 2024];
MVD_IMAGE_DATA_INFO stImageData = new MVD_IMAGE_DATA_INFO();
stImageData.stDataChannel[0].arrDataBytes = data;
stImageData.stDataChannel[0].nRowStep = width;
stImageData.stDataChannel[0].nSize = width * height;
stImageData.stDataChannel[0].nLen = width * height;
MVD_PIXEL_FORMAT pixelFormat = MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08;
VisionDesigner.CMvdImage cInputImg = new CMvdImage();
cInputImg.InitImage(width, height , pixelFormat, stImageData);
//字符识别算子
VisionDesigner.OCR.COCRTool cOCRToolObj = new VisionDesigner.OCR.COCRTool ();
cOCRToolObj.InputImage = cInputImg;

问题根因
不熟悉算子模块函数接口

3.2.4 实时取流:实时取流的实现方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:在算子SDK开发中,如何实现实时取流?
解答
VM算子SDK中提供了有关相机的操作算子,首先,我们需要了解一般步骤。对于设备进行操作,实现图像采集、参数配置等功能,需要先连接设备(打开设备),其具体流程如下图所示。
用代码实现步骤如下,连接相机并开始取流。

C# 
using VisionDesigner.Camera; //引用命名空间
private CCameraTool m_cMyCameraToolObj = null;//定义一个设备对象
Thread m_hReceiveThread = null;//定义取流线程
private bool _bGrabbing = false;
// 打开相机并开始取图方法
public int OpenCamera(int cameraIndex = 0)
{
    try
    {
        if (null == m_cMyCameraToolObj)
        {
            m_cMyCameraToolObj = new CCameraTool();
            if (null == m_cMyCameraToolObj)
            {
                return -1;
            }
        }
        //1、通过MVD_TRANSFER_LAYER_TYPE类型枚举设备,返回设备个数
        int nRet = CCameraTool.EnumDevices((uint)MVD_TRANSFER_LAYER_TYPE.MVD_USB_DEVICE | (uint)MVD_TRANSFER_LAYER_TYPE.MVD_GIGE_DEVICE);
        if (0 == nRet)
        {
            return -1;
        }
        //2、选择索引的设备并判断是否可达
        m_cMyCameraToolObj.SelectDevice(cameraIndex);
        if (!m_cMyCameraToolObj.IsDeviceAccessible(1))
            return -1;
        //3、打开设备,并设置相机参数(相机参数根据实际需求进行设置)
        m_cMyCameraToolObj.OpenDevice();
        m_cMyCameraToolObj.SetEnumValue("AcquisitionMode", (uint)MVD_CAM_ACQUISITION_MODE.MVD_ACQ_MODE_CONTINUOUS);
        m_cMyCameraToolObj.SetEnumValue("TriggerMode", (uint)MVD_CAM_TRIGGER_MODE.MVD_TRIGGER_MODE_OFF);
        m_cMyCameraToolObj.SetEnumValue("PixelFormat", (uint)MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3);
        //4、开始取图
        m_cMyCameraToolObj.StartGrab();
        _bGrabbing = true;
        m_hReceiveThread = new Thread(GetStreamThreadProc);
        m_hReceiveThread.Start();//启动线程主动取流
        return 0;

    }
    catch (Exception)
    {
        return -1;
    }
}
// 取流线程
private void GetStreamThreadProc()
{
    CMvdImage cFrameImage = new CMvdImage();
    while (_bGrabbing)
    {
        //5、获取一帧图像
        m_cMyCameraToolObj.CameraGrabResult.GetOneFrameTimeout(ref cFrameImage);
        //判断图像格式,将图像加载到UI界面的控件mvdRenderActivex1上
        if ((VisionDesigner.MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08 == imgtemp.PixelFormat) || (VisionDesigner.MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3 == imgtemp.PixelFormat))
        {
            mvdRenderActivex1.LoadImageFromObject(cFrameImage);
            mvdRenderActivex1.Display();
        }
    }
}
// 停止抓图
private void StopGrab()
{
    try
    {
        _bGrabbing = false;
        if (null != m_hReceiveThread)
        {
            m_hReceiveThread.Abort();
            m_hReceiveThread = null;
        }
        //6、停止抓图、关闭设备、释放资源
        m_cMyCameraToolObj.StopGrab();
        m_cMyCameraToolObj.CloseDevice();
        m_cMyCameraToolObj.Dispose();
    }
    catch (Exception ex)
    { }
}

除了直接使用VisionDesigner.Camera.CCameraTool,通过以上步骤完成,也可以使用VM算子SDK的相机控件mvdCameraEdit,需要调用mvdCameraEdit.GetSubject()将算子对象赋给CCameraTool,再调用GetOneFrameTimeout()获取帧图像即可,详细可以参考路径“C:\Program Files (x86)\MVDAlgorithmSDK\Samples\CSharp\ControlSamples”下的CameraControlDemo示例。
问题根因
VM算子SDK中相机取流的步骤不熟悉。

3.2.5 卡尺ROI:卡尺型ROI的生成方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:算子SDK开发,默认支持的ROI类型不包含直线卡尺ROI和圆卡尺ROI,那么该如何生成这两种类型的ROI,并且正确传递给算子使用呢?
解答
1.直线卡尺ROI
直线卡尺ROI是由线段、卡尺数量、卡尺宽、卡尺高四个元素组合生成的,生成示例代码如下:

C#
private void GenLineCaliperROIAlg(MVD_POINT_F startPoint, MVD_POINT_F endPoint, float angle, int caliperCount, float caliperWidth, float caliperHeight, ref List<CMvdRectangleF> cMvdRectangleFList, ref CMvdRectangleF minRect)
{
      CaliperCenters.Clear();

      float fLineHeight = endPoint.fY - startPoint.fY;
      float fLineWidth = endPoint.fX - startPoint.fX;
      float xOffset = fLineWidth / (caliperCount + 1);
      float yOffset = fLineHeight / (caliperCount + 1);

      float fRotateAngle = angle;
      MVD_POINT_F stCenter = new MVD_POINT_F();
      CMvdRectangleF rectangleF;
      // 生成卡尺框列表
      for (int i = 1; i < caliperCount + 1; i++)
      {
           stCenter.fX = startPoint.fX + xOffset * i;
           stCenter.fY = startPoint.fY + yOffset * i;
           CaliperCenters.Add(stCenter);
           rectangleF = new CMvdRectangleF(stCenter.fX, stCenter.fY, caliperWidth, caliperHeight);
           rectangleF.Angle = fRotateAngle;
           rectangleF.BorderColor = blue;
           cMvdRectangleFList.Add(rectangleF);
      }

      // 生成最小外接矩形
      float LineMidX = (float)(0.5 * (endPoint.fX + startPoint.fX));
      float LineMidY = (float)(0.5 * (endPoint.fY + startPoint.fY));
      minRect = new CMvdRectangleF(LineMidX, LineMidY, fLineWidth, caliperHeight);
      minRect.Angle = fRotateAngle;
}

生成直线卡尺ROI后,一般提供给直线查找算子使用。使用时,算子的ROI设置为直线卡尺ROI的最小外接矩形,算子基本参数的运行模式设置为ONLY_FIND模式,算子基本参数的卡尺框列表设置为卡尺框的列表。调用示例代码如下:

C#
private List<CMvdRectangleF> cMvdRectangleFs = new List<CMvdRectangleF>();
cMvdRectangleFs.Clear();

CMvdRectangleF minRect = new CMvdRectangleF(cMvdImage.Width / 2, cMvdImage.Height / 2, cMvdImage.Width / 4, cMvdImage.Height / 4);
MVD_POINT_F lineStartPoint = new MVD_POINT_F(1700, 1122);
MVD_POINT_F lineEndPoint = new MVD_POINT_F(2286, 1122);
float angleRad = (float)Math.Atan2((lineEndPoint.fY - lineStartPoint.fY), (lineEndPoint.fX - lineStartPoint.fX));
float angle = (float)(angleRad / Math.PI * 180.0);
GenLineCaliperROIAlg(lineStartPoint, lineEndPoint, angle, caliperCount, caliperWidth, caliperHeight, ref cMvdRectangleFs, ref minRect);

// 直线查找
CLineFindTool cLineFindTool = new CLineFindTool();
cLineFindTool.InputImage = cMvdImage;
cLineFindTool.ROI = minRect;
cLineFindTool.BasicParam.RunningMode = VisionDesigner.LineFind.MVD_RUNNING_MODE.MVD_RUNNING_MODE_ONLY_FIND; // 查找结果受ROI和CaliperList影响     
cLineFindTool.BasicParam.CaliperList = cMvdRectangleFs;
cLineFindTool.SetRunParam("LineFindMode", "Best");
cLineFindTool.SetRunParam("EdgePolarity", "Both");
cLineFindTool.Run();

CLineFindResult cLineFindRes = cLineFindTool.Result;
List<CLineFindEdgePointInfo> cLineFindEdgePointInfos = cLineFindRes.EdgePointInfo;

// 直线轮廓点
CMvdPointSetF lineEdgePoint = new CMvdPointSetF();
lineEdgePoint.BorderColor = green;
for (int i = 0; i < cLineFindEdgePointInfos.Count; i++)
{
lineEdgePoint.AddPoint(cLineFindEdgePointInfos[i].EdgePoint.fX, cLineFindEdgePointInfos[i].EdgePoint.fY, i);
}
mvdRenderActivex1.AddShape(lineEdgePoint);

// 输出直线
CMvdLineSegmentF line = new CMvdLineSegmentF(new MVD_POINT_F(cLineFindRes.LineStartPoint.fX, cLineFindRes.LineStartPoint.fY), new MVD_POINT_F(cLineFindRes.LineEndPoint.fX, cLineFindRes.LineEndPoint.fY));
line.BorderColor = green;
mvdRenderActivex1.AddShape(line);

// 直线卡尺框
for (int i = 0; i < caliperCount; i++)
{
mvdRenderActivex1.AddShape(cMvdRectangleFs[i]);
}

// 直线检测区域
minRect.BorderColor = blue;
mvdRenderActivex1.AddShape(minRect);
mvdRenderActivex1.Display();

2.圆卡尺ROI
圆卡尺ROI是由圆心、半径、卡尺数量、卡尺宽、卡尺高五个元素组合生成的,生成示例代码如下:

C#
private void GenCircleCaliperROIAlg(MVD_POINT_F centerPoint, float radius, int caliperCount, float caliperWidth, float caliperHeight, ref List<CMvdRectangleF> cMvdRectangleFList, ref CMvdRectangleF minRect)
{
     CaliperCenters.Clear();

      float angleOffset = 360.0f / caliperCount;
      float angleStart = 180.0f / caliperCount;

      MVD_POINT_F stCenter = new MVD_POINT_F();
      CMvdRectangleF rectangleF;
      // 生成卡尺框列表
      for (int i = 0; i < caliperCount; i++)
      {
           float fRotateAngle = angleStart + angleOffset * i;
           if (fRotateAngle > 180.0f)
           {
                fRotateAngle -= 360.0f;
           }
           stCenter.fX = (float)(radius * Math.Cos(fRotateAngle / 180.0f * Math.PI) + centerPoint.fX);
           stCenter.fY = (float)(radius * Math.Sin(fRotateAngle / 180.0f * Math.PI) + centerPoint.fY);
           CaliperCenters.Add(stCenter);
           rectangleF = new CMvdRectangleF(stCenter.fX, stCenter.fY, caliperHeight, caliperWidth);
           rectangleF.Angle = fRotateAngle;
           rectangleF.BorderColor = blue;
           cMvdRectangleFList.Add(rectangleF);
      }

      // 生成最小外接矩形
      float CircleMidX = centerPoint.fX;
      float CircleMidY = centerPoint.fY;
      minRect = new CMvdRectangleF(CircleMidX, CircleMidY, (float)(2 * radius + caliperHeight), (float)(2 * radius + caliperHeight));
      minRect.Angle = 0.0f;
}

生成圆卡尺ROI后,一般提供给圆查找算子使用。使用时,算子的ROI设置为圆卡尺ROI的最小外接矩形,算子基本参数的运行模式设置为ONLY_FIND模式,算子基本参数的卡尺框列表设置为卡尺框的列表。调用示例代码如下:

C#
private List<CMvdRectangleF> cMvdRectangleFs = new List<CMvdRectangleF>();
cMvdRectangleFs.Clear();

CMvdRectangleF minRect = new CMvdRectangleF(cMvdImage.Width / 2, cMvdImage.Height / 2, cMvdImage.Width / 4, cMvdImage.Height / 4);
MVD_POINT_F circleCenter = new MVD_POINT_F(2258, 1961);
float circleRadius = 357;
GenCircleCaliperROIAlg(circleCenter, circleRadius, caliperCount, caliperWidth, caliperHeight, ref cMvdRectangleFs, ref minRect);

// 圆查找
CCircleFindTool cCircleFindTool = new CCircleFindTool();
cCircleFindTool.InputImage = cMvdImage;
cCircleFindTool.ROI = minRect;
cCircleFindTool.BasicParam.RunningMode = VisionDesigner.CircleFind.MVD_RUNNING_MODE.MVD_RUNNING_MODE_ONLY_FIND; // 查找结果受ROI和CaliperList影响     
cCircleFindTool.BasicParam.CaliperList = cMvdRectangleFs;
float fMinRadius = (float)(circleRadius - 0.5 * caliperHeight);
float fMaxRadius = (float)(circleRadius + 0.5 * caliperHeight);
cCircleFindTool.SetRunParam("MinRadius", Convert.ToInt32(fMinRadius).ToString());
cCircleFindTool.SetRunParam("MaxRadius", Convert.ToInt32(fMaxRadius).ToString());
cCircleFindTool.SetRunParam("EdgeThresh", "15");
cCircleFindTool.SetRunParam("CircleFindMode", "Best");
cCircleFindTool.SetRunParam("EdgePolarity", "WhiteToBlack");
cCircleFindTool.SetRunParam("RejectNum", "0");
cCircleFindTool.SetRunParam("RejectDist", "5");
cCircleFindTool.Run();

CCircleFindResult cCircleFindRes = cCircleFindTool.Result;
List<CCircleFindEdgePointInfo> cCircleFindEdgePointInfos = cCircleFindRes.EdgePointInfo;

// 圆轮廓点
CMvdPointSetF circleEdgePoint = new CMvdPointSetF();
circleEdgePoint.BorderColor = green;
for (int i = 0; i < cCircleFindEdgePointInfos.Count; i++)
{
circleEdgePoint.AddPoint(cCircleFindEdgePointInfos[i].EdgePoint.fX, cCircleFindEdgePointInfos[i].EdgePoint.fY, i);
}
mvdRenderActivex1.AddShape(circleEdgePoint);

// 输出圆环
CMvdCircleF circle = new CMvdCircleF(cCircleFindRes.Circle.Center, cCircleFindRes.Circle.Radius);
circle.BorderColor = green;
mvdRenderActivex1.AddShape(circle);

// 输出ROI圆弧
CMvdAnnularSectorF circleAnnu = new CMvdAnnularSectorF(circleCenter, fMinRadius, fMaxRadius, 0.0f, 360.0f);
circleAnnu.BorderColor = blue;
mvdRenderActivex1.AddShape(circleAnnu);

// 圆卡尺框
for (int i = 0; i < caliperCount; i++)
{
mvdRenderActivex1.AddShape(cMvdRectangleFs[i]);
}

// 圆检测区域
minRect.BorderColor = blue;
mvdRenderActivex1.AddShape(minRect);
mvdRenderActivex1.Display();

运行效果如下图所示。
在这里插入图片描述

问题根因
不熟悉卡尺型ROI的生成方法。

3.2.6 DL算子耗时:深度学习算子长时间停止再运行耗时变长问题的解决方法

描述
环境:MVDAlgrithm SDK3.4及以上 + VS2013及以上
现象:深度学习算子长时间停止再运行,第一次运行耗时会变长,如何解决?
解答
原因是显卡休眠,深度学习算子运行前需要初始化CUDA资源,故第一次耗时较长。长时间停止将导致显卡休眠,从而导致再运行耗时变长。所以,需每隔一定周期将显卡唤醒,防止软件一段时间未运行时显卡休眠。显卡唤醒进程代码如下:

C++
int main()
{
	printf("====================Awake Gpu start====================\n");
	// 覆盖写入文件,不必删除文件
	std::ofstream outFile("AwakenGPUToolLog.txt");
	outFile << "Awake Gpu start" << std::endl;

	//开启线程进行防GPU空闲
	int       data_c[2] = { 0 };
	int      *data_g = NULL;
	int                        gpu_count = 0;
	cudaError_t                    err = cudaSuccess;
	struct cudaDeviceProp          prop = { 0 };

	do 
	{
		err = cudaGetDeviceCount(&gpu_count);
		if ((cudaSuccess != err) || (1 > gpu_count))
		{
			printf("Have no cuda device.err = %d\n", err);
			outFile << "Have no cuda device, err = " << err << std::endl;
			break;
		}

		err = cudaMalloc((void**)&data_g, sizeof(int));

		if (cudaSuccess != err)
		{
			printf("Cuda malloc error. err = %d\n", err);
			outFile << "Cuda malloc error, err = " << err << std::endl;
			break;
		}

		outFile << "GPU OK." << std::endl;

		while (1)
		{
			Sleep(10000);

			err = cudaMemcpy(data_g, data_c, sizeof(int), cudaMemcpyHostToDevice);
			if (cudaSuccess != err)
			{
				printf("Cuda memcpy error.\n");
				outFile << "Cuda memcpy error, err = " << err << std::endl;
				continue;
			}
			printf("GPU OK.\n");
		}

	} while (false);

	outFile << "Awake Gpu end." << std::endl;
	if (NULL != data_g)
	{
		cudaFree(data_g);
		data_g = NULL;
	}
	outFile.close();

	//system("Pause");
	return 0;
}

问题根因
不熟悉显卡唤醒的方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ref在Vue2、Vue3中的使用

文章目录 前言一、ref在Vue2中的用法二、ref在Vue3中的用法 前言 记录一下ref在Vue2与Vue3中的使用&#xff0c;ref可以获取DOM元素&#xff0c;也可以获取子组件的数据、方法。 一、ref在Vue2中的用法 给元素绑定一个ref&#xff0c;然后在js中通过this.$refs获取DOM。 ref命…

从大厂到创业公司,管理上需要怎样转变?

你好&#xff0c;我是舒超。 我职业生涯过去十年的上半段在腾讯负责微博微群、消息流广告、视频评论等社交型的业务系统&#xff0c;下半段在美团基础架构负责云原生基础设施的演进工作&#xff0c;现在星汉未来担任CTO&#xff0c;负责公司产研推进工作。加入星汉未来的时间点…

带你搞懂人工智能、机器学习和深度学习!

不少高校的小伙伴找我聊入门人工智能该怎么起步&#xff0c;如何快速入门&#xff0c;多长时间能成长为中高级工程师&#xff08;聊下来感觉大多数学生党就是焦虑&#xff0c;毕业即失业&#xff0c;尤其现在就业环境这么差&#xff09;&#xff0c;但聊到最后&#xff0c;很多…

MongoDB【索引-index】

目录 1&#xff1a;概述 2&#xff1a;索引的类型 2.1&#xff1a;单字段索引 2.2&#xff1a;复合索引 2.3&#xff1a;其他索引 3&#xff1a;索引的管理操作 3.1&#xff1a;索引的查看 3.2&#xff1a;索引的创建 3.3&#xff1a;索引的移除 4&#xff1a;索引的…

微短剧“小阳春”,“爱优腾芒”抢滩登陆?

降本增效一整年&#xff0c;长视频平台们似乎扭转了市场对于它们“烧钱”的印象。 爱奇艺宣布2022全年盈利&#xff0c;腾讯视频宣布从去年10月起开始盈利&#xff0c;视频平台们结束了一场“无限战争”。 与此同时&#xff0c;随着短视频平台的崛起&#xff0c;视频内容的形…

【Hadoop-HDFS】HDFS中Fsimage与Edits详解

【Hadoop-HDFS】HDFS中Fsimage与Edits详解 1&#xff09;概述2&#xff09;NameNode元数据解析3&#xff09;Fsimage3.1.Fsimage 的作用3.2.FSimage 的文件信息查看 4&#xff09;Edits4.1.Edits 的作用4.2.Edits 的文件信息查看 5&#xff09;元数据信息目录的配置 1&#xff…

Shell+VCS学习1

Shell脚本常见问题 mkdir rmdir rm mkdir 创建文件夹 mkdir -p filename-p 确保目录名称存在&#xff0c;不存在的就建一个。 mkdir -p runoob2/test若 runoob2 目录原本不存在&#xff0c;则建立一个。&#xff08;注&#xff1a;本例若不加 -p 参数&#xff0c;且原本 ru…

栈和队列的转换

在之前的博客当中我们已经学习了栈和队列。在本次的博客当中我们就来学习一下怎么将栈和队列进行相互转换。 栈和队列的相互转换其实是两道OJ题。如果在leetcode上面刷过题的小伙伴们可能早就见过这两种数据结构的相互转换。下面我们就来分别讲解一下这两道OJ题目的编写思路。 …

如何基于vue实现倒计时效果

如何基于vue实现倒计时效果 基于vue2 element实现画面效果代码 基于vue2 element 实现画面效果 代码 <template><div><div class"Box"><div style"position: relative;"><el-progress type"circle" :width"…

使用注解实现REDIS分布式锁

一、业务背景 有些业务请求&#xff0c;属于耗时操作&#xff0c;需要加锁&#xff0c;防止后续的并发操作&#xff0c;同时对数据库的数据进行操作&#xff0c;需要避免对之前的业务造成影响。 二、分析流程 使用 Redis 作为分布式锁&#xff0c;将锁的状态放到 Redis 统一…

基于SpringBoot+Vue+Java的社区医院管理服务系统(附源码+数据库)

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括社区医院管理服务系统的网络应用&#xff0c;在外国线上管理系统已经是很普遍的方式&#xff0c;不过国内的管理系统可能还处于起步阶段。社区医院管理服务系统具有社区…

一道经典的小学数学题,和它背后的贪心算法(35)

小朋友们好&#xff0c;大朋友们好&#xff01; 我是猫妹&#xff0c;一名爱上Python编程的小学生。 欢迎和猫妹一起&#xff0c;趣味学Python。 今日主题 这个五一小长假&#xff0c;你玩得怎么样&#xff1f; 今天&#xff0c;咱们先做一道经典的小学数学题&#xff0c;…

智慧物流信息系统开发需具备哪些功能?

智慧物流软件开发公司在制作管理系统的时候&#xff0c;需要具备的功能有哪些呢&#xff1f; 一、采集跟踪功能。 &#xff08;1&#xff09;、信息采集&#xff1a;信息采集跟踪系统是智能物流系统的重要组成部分。物流信息采集系统主要由RFID射频识别系统和Savan…

2022年度项目管理软件排名揭晓:哪些软件在市场中脱颖而出?

在项目管理软件的选择过程中&#xff0c;用户会倾向于参考一些软件排名来辅助自己进行选择。软件排名方面推荐参考G2&#xff0c;一个国外的靠谱软件评测网站&#xff0c;类似于软件版的“大众点评”&#xff0c;软件评价来自于真实用户&#xff0c;网站通过多维度的算法&#…

JAVA入坑之GUI编程

一、相关概述 GUI编程是指通过图形化的方式来实现计算机程序的编写&#xff0c;它可以让用户通过鼠标、键盘等设备来操作计算机&#xff0c;而不是通过命令行来输入指令。在Java中&#xff0c;GUI编程主要使用的是Swing和AWT两种技术 二、AWT 2.1介绍 AWT是Java提供的用来建立…

八部门联合推动IPv6创新发展 知道创宇助力IPv6快速安全改造

近日&#xff0c;工业和信息化部、中央网信办、国家发展改革委、教育部、交通运输部、人民银行、国务院国资委、国家能源局等八部门联合印发《关于推进IPv6技术演进和应用创新发展的实施意见》&#xff08;以下简称“《实施意见》”&#xff09;&#xff0c;提出到2025年底&…

密歇根大学Python 系列之三:Python 数据科学应用项目

Python在数据科学领域的应用已经成为了趋势&#xff0c;同时也在不断地发展和演化。对于从事数据科学相关工作的从业者来说&#xff0c;熟练掌握Python已经成为了必备技能之一。而对于其他从业者来说&#xff0c;了解Python在数据科学领域的应用也可以帮助他们更好地理解数据科…

必知的Facebook广告兴趣定位技巧,更准确地找到目标受众

在Facebook广告投放中&#xff0c;兴趣定位是非常重要的一环。兴趣定位不仅可以帮助我们找到我们想要的目标受众&#xff0c;还可以帮助我们避免一些常见的坑。今天&#xff0c;就让我们一起来看看必知的Facebook广告兴趣定位技巧&#xff0c;更准确地找到目标受众。 1.不要只关…

pwm调节亮度

文章目录 运行环境&#xff1a;1.1 pwm1)占空比2)A板原理图3)PE11引脚配置4)定时器Timers配置 2.1代码解释1)定时器1初始化函数2)启动定时器中断3)启动PWM/设置占空比4)launch设置5) 编译调试 3.1实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32…

VSCode 上的 swift 开发配置

安装Xcode和VsCode 在下列网址下载安装即可 VsCode: https://code.visualstudio.com/ Xcode:https://developer.apple.com/xcode/resources/ 或者apptore 打开xcode要求安装的东西都允许安装一下 启用 Swift 语言支持 确保你已经安装了 Xcode 和 VSCode。这是开始运行的最简…