试着写几个opencv的程序

一、认识opencv

OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉库,旨在提供丰富的图像处理和计算机视觉功能,以帮助开发者构建视觉应用程序。OpenCV最初由英特尔开发,现在由社区维护和支持。它支持多个编程语言,包括C++、Python、Java等,使其在各种平台上广泛应用。

以下是OpenCV的主要特点和功能:

  1. 图像处理:OpenCV提供了一系列强大的图像处理功能,包括图像加载、保存、裁剪、缩放、旋转、滤波、边缘检测、直方图均衡化等。

  2. 计算机视觉算法:OpenCV包括许多计算机视觉算法,如目标检测、特征提取、对象跟踪、人脸识别、图像分割、立体视觉等。这些功能可用于构建图像分析、模式识别和机器视觉应用。

  3. 机器学习集成:OpenCV与机器学习库(如scikit-learn、TensorFlow等)集成紧密,可以用于训练和部署机器学习模型,例如分类、回归和聚类任务。

  4. 摄像机和视频处理:OpenCV支持摄像机捕获和视频处理,可以用于实时视频分析、跟踪和处理。

  5. 多平台支持:OpenCV可以在多个操作系统上运行,包括Windows、Linux、macOS和Android。它还支持多个编程语言,使得开发者可以根据自己的需求选择最合适的语言。

  6. 优化和加速:OpenCV经过优化,可以充分利用硬件加速功能,如CPU、GPU和FPGA,以提高性能。

  7. 开源社区:OpenCV有一个庞大的开源社区,提供了大量的文档、教程和支持,使开发者能够快速入门和解决问题。

  8. 跨平台图形用户界面(GUI):OpenCV还包括一个简单的跨平台GUI库,用于创建图形用户界面,以便用户与视觉应用程序交互。

OpenCV已经被广泛应用于各种领域,包括机器视觉、自动驾驶、医学图像处理、安全监控、图像检索、虚拟现实等。无论是学术研究、工业应用还是个人项目,OpenCV都是一个强大的工具,用于解决各种视觉问题。无论你是初学者还是专业开发者,OpenCV都提供了强大的工具和资源,可以帮助你在计算机视觉领域取得成功

参考博客:图像处理 OpenCV简介_落花雨时的博客-CSDN博客

 提问:用python使用opencv好还是用c++使用opencv好?

选择使用Python还是C++来使用OpenCV取决于你的项目需求、个人偏好和性能要求等因素。以下是一些考虑因素:

使用Python的优势:

  1. 易学易用:Python是一门容易学习和使用的语言,特别适合初学者。它的语法简洁,代码可读性高。

  2. 丰富的库和生态系统:Python有大量的库和框架,涵盖了各种领域,包括科学计算、机器学习、图像处理等。对于计算机视觉任务,有许多与OpenCV结合使用的库,如NumPy、Pillow、scikit-image等。

  3. 快速原型开发:Python具有快速原型开发的优势,你可以快速测试和迭代图像处理算法,而不需要编写大量的模板代码。

  4. 社区支持:Python有一个庞大的社区,你可以轻松地找到教程、文档和社区支持。

使用C++的优势:

  1. 性能:C++通常比Python更快,特别适合需要高性能的图像处理任务,如实时计算机视觉应用或大规模图像处理。

  2. 低级控制:C++提供了对底层硬件的更好控制,适合开发需要与硬件交互的应用程序。

  3. OpenCV原生支持:OpenCV的主要版本是用C++编写的,因此在C++中使用OpenCV可以直接利用OpenCV的功能和性能。

  4. 多线程和并行处理:C++更容易实现多线程和并行处理,可以加速计算密集型图像处理任务。

综合考虑这些因素,如果你的项目对性能要求较高,或者需要与硬件交互,那么使用C++可能更合适。另一方面,如果你希望快速原型开发、代码可读性高,或者在机器学习和数据分析方面有需求,那么Python可能更适合。有时候,也可以将两者结合使用,例如使用C++编写性能关键的部分,然后使用Python进行高级封装和可视化。

最终的选择取决于你的具体项目需求和你自己的编程经验。

提问:c++和c区别在哪?

C++和C是两种编程语言,它们在很多方面相似,但也有一些重要的区别。以下是C++和C之间的一些主要区别:

  1. 面向对象编程 (OOP) 支持

    • C++是一种支持面向对象编程的语言,它允许使用类和对象来组织代码和数据,以及使用封装、继承和多态等概念。
    • C语言不支持面向对象编程,它是一种过程式编程语言,代码通常由函数组成,没有类和对象的概念。
  2. 类和对象

    • 在C++中,你可以创建类来定义自定义数据类型,然后使用类创建对象。这允许你将数据和相关的操作封装在一起。
    • 在C中,没有类和对象的概念,数据和函数通常是分开的。
  3. 函数重载

    • C++支持函数重载,这意味着你可以在同一个作用域内定义多个同名函数,但它们的参数列表不同。编译器根据参数列表的不同来选择正确的函数。
    • C语言不支持函数重载。
  4. 运算符重载

    • C++允许运算符重载,这意味着你可以自定义类的运算符行为。
    • C语言不支持运算符重载。
  5. 标准模板库 (STL)

    • C++提供了STL,它包括各种数据结构和算法,如向量、链表、队列、堆栈、排序和搜索算法等,这些都可以在标准库中直接使用。
    • C语言没有STL,通常需要手动实现这些数据结构和算法,或使用第三方库。
  6. 异常处理

    • C++支持异常处理,允许程序在发生错误时抛出和捕获异常。
    • C语言通常使用错误码和条件语句来处理错误,而不是异常机制。
  7. 内存管理

    • C++提供了 newdelete 运算符来进行动态内存分配和释放,但也需要程序员手动管理内存。
    • C语言同样提供了动态内存分配函数如 mallocfree,但没有C++中的类似 newdelete 的运算符。

总之,C++在C的基础上引入了面向对象编程和许多其他高级特性,使得它更适合开发大型、复杂的应用程序,而C语言更接近底层硬件,通常用于编写系统级的、性能关键的代码。选择使用哪种语言通常取决于项目的需求和开发目标。

二、4h上手C++版OpenCV

如果我们想要更细节的图像,可以增加这些格子(像素)的数量,

VGA HD FHD 4K代表固定数量的格子(像素)

二进制图像(两个层次)

 也意味着有254个灰度图

对于彩色图像,有三个灰度图像,分别代表了是红,绿,蓝的强度(RGB),将这些叠加起来就构成了彩色图像

  1. 单通道图像

    • 单通道图像也称为灰度图像。它们只包含一个灰度通道,每个像素只有一个灰度值,表示亮度信息。
    • 在单通道图像中,颜色信息是缺失的,因此图像通常是黑白的,只包含灰度级别。
    • 单通道图像常用于需要仅考虑亮度而不考虑颜色的应用,如图像分割、图像增强、边缘检测等。
  2. 多通道图像

    • 多通道图像包括多个颜色信息通道。最常见的是三通道图像,其中包含红色、绿色和蓝色三个通道。
    • 三通道图像也称为彩色图像,因为它们可以显示多种颜色。
    • 除了RGB图像,还有其他多通道图像格式,如RGBA(包含透明通道)、CMYK(用于印刷)、HSL(色相、饱和度、亮度)等。
    • 多通道图像广泛用于图像和视频处理中,可以表示和处理各种颜色信息。

总的来说,单通道图像包含灰度信息,而多通道图像包含多个颜色信息通道,可以呈现多种颜色。在图像处理中,您根据具体的任务和需求选择使用单通道或多通道图像,并选择合适的颜色空间进行处理。例如,RGB颜色空间用于普通彩色图像,而灰度图像常用于某些特定任务。

Chapter1:读取图片、视频、和摄像头(Read Images Videos and Webcams)

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;//导入图像  Importing Images//
//
//int main() {
//	string path = "Resources/test.png";
//	Mat img = imread(path);
//	imshow("Image", img);
//	waitKey(0); //0表示图片会一直显示不关闭
//	return 0; 
//}///导入视频
//void main() {
//
//	string path = "Resources/test_video.mp4";
//	VideoCapture cap(path);
//	Mat img;
//
//	while (true) {
//		
//		cap.read(img);
//		imshow("Image",img);
//		waitKey(1);//1毫秒的意思,如果想要让视频播放速度变慢,这里可以将1毫秒换成20毫秒
//
//	}
//}/网络摄像头 webcam/
void main() {VideoCapture cap(0);Mat img;while (true) {cap.read(img);imshow("Image",img);waitKey(1);//1毫秒的意思,如果想要让视频播放速度变慢,这里可以将1毫秒换成20毫秒}
}

Chapter2:基本函数功能(Basic Function)

 

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;//Basic Function//int main() {string path = "Resources/test.png";Mat img = imread(path);Mat imgGray, imgBlur, imgCanny, imgDil, imgErode;cvtColor(img, imgGray, COLOR_BGR2GRAY);//将原始图像转变成灰度图像//接下来添加高斯模糊GaussianBlur(imgGray, imgBlur, Size(7, 7),5,0);//将7,7换成3,3后可以明显看出图像模糊的不那么明显//Canny 边缘检测算法Canny(imgBlur, imgCanny, 25, 75);//50,150可以看出边缘不是很清楚,将参数调成25,75,边缘更清楚了//膨胀图像边缘Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));//增大参数,膨胀的会多,减小参数,膨胀的会晓dilate(imgCanny, imgDil, kernel);//侵蚀erode(imgDil, imgErode, kernel);imshow("Image", img);imshow("Image Gray", imgGray);imshow("Image Blur", imgBlur);//显示模糊后的图像imshow("Image Canny", imgCanny);imshow("Image Dilation", imgDil);//显示膨胀后的边缘图像imshow("Image Erode", imgErode);waitKey(0); //0表示图片会一直显示不关闭return 0;
}

Chapter3:调整大小和裁剪(Resize and Crop)

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;//Resize and Crop //void main() {string path = "Resources/test.png";Mat img = imread(path);Mat imgResize,imgCrop;//cout << img.size() << endl;  //输出图像的大小为768(宽)×559(高)//resize(img, imgResize, Size(640, 480));//将大小调整至640×480resize(img, imgResize, Size(),0.5,0.5);//将图像宽度和高度分别按照0.5,0.5的比例缩小Rect roi(200, 100, 300, 300);imgCrop = img(roi);imshow("Image", img);imshow("Image Resize", imgResize);imshow("Image imgCrop", imgCrop);waitKey(0); //0表示图片会一直显示不关闭}

Chapter4:绘制形状和文本(Drawing Shapes and Text)

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;//Draw Shapes and Text //void main() {//Blank ImageMat img(512, 512, CV_8UC3, Scalar(255, 255, 255));//三个参数分别代表bgr中的blue,green,red//定义空白图像的颜色时通常采用Scalar标量来定义,255,0,0代表blue,255,0,255代表紫色,255,255,255代表白色,0,0,0代表褐色//circle(img, Point(256, 256), 155,Scalar(0, 69, 255),10);//10这个参数是厚度,可以写也可以不写circle(img, Point(256, 256), 155, Scalar(0, 69, 255),FILLED);//rectangle(img, Point(130, 226),Point(382, 286), Scalar(255, 255, 255), 3);//两个point分别指代的是矩形的左上角和右下角顶点的位置,3是边缘的厚度rectangle(img, Point(130, 226), Point(382, 286), Scalar(255, 255, 255), FILLED);//显示出的是一个白色填充的矩形 line(img, Point(130, 296), Point(382, 296), Scalar(255, 255, 255), 2);//如果将296换成450,将会是一条斜线//写入文字putText(img, "I am Superman!!!", Point(150, 262), FONT_HERSHEY_DUPLEX,0.75, Scalar(0, 69, 255), 1.5);imshow("Image", img);waitKey(0); //0表示图片会一直显示不关闭}

Chapter5:扭曲透视(Warp Perspective)

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;//Warp Images(对图像进行几何变换)//float w = 250, h = 350;
Mat matrix, imgWarp;
void main() {string path = "Resources/cards.jpg";Mat img = imread(path);Point2f src[4] = { {529,142},{771,190},{405,395},{674,457} };Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };matrix = getPerspectiveTransform(src, dst);//warpPerspective(img, imgWarp, matrix,Point(w,h));//执行透视变换(Perspective Transformation)操作for (int i = 0; i < 4; i++) {circle(img,src[i], 10, Scalar(0, 0, 255), FILLED);}imshow("Image", img);imshow("Image Warp", imgWarp);waitKey(0); //0表示图片会一直显示不关闭}

Chapter6:颜色检测(Color Detection)

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;//  Color Detection  //Mat imgHSV,mask;
int hmin = 0, smin = 0, vmin = 0;
int hmax = 179, smax = 255, vmax = 255;void main() {string path = "Resources/shapes.png";Mat img = imread(path);cvtColor(img, imgHSV, COLOR_BGR2HSV);//BGR 彩色图像转换为 HSV 色彩空间,色调 (H)、色度 (S) 和亮度 (V)namedWindow("Trackbars", (640, 200));//创建一个名为"TrackBars"的窗口(跟踪栏)。这个窗口通常用于创建可调节参数(trackbars)的用户界面,//指定窗口的大小为(640, 200)像素,以便用户可以通过拖动滑块来调整参数的值。createTrackbar("Hue Min","Trackbars",&hmin,179);//在名为"Trackbars"的窗口中创建一个名为"Hue Min"的滑块控件,并将其与一个名为"hmin"的变量关联起来。//滑块允许的最大值是179,通常情况下,这是因为"Hue"通道的取值范围是0到179(通常表示色相角度)。createTrackbar("Hue Max", "Trackbars", &hmax, 179);createTrackbar("Sat Min", "Trackbars", &smin, 255);createTrackbar("Sat Max", "Trackbars", &smax, 255);createTrackbar("Val Min", "Trackbars", &vmin, 255);createTrackbar("Val Max", "Trackbars", &vmax, 255);while (true) {Scalar lower(hmin,smin,vmin);Scalar upper(hmax, smax, vmax);inRange(imgHSV,lower,upper,mask);imshow("Image", img);imshow("Image HSV", imgHSV);imshow("Image MASK", mask);waitKey(1);}
}

Chapter7:形状/轮廓检测(Shapes/Contour Detection)

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>using namespace cv;
using namespace std;
//Images//Mat imgGray, imgBlur, imgCanny, imgDil, imgErode;void getContours(Mat imgDil,Mat img) {vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);//drawContours(img, contours, -1, Scalar(255, 0, 255), 10);vector<vector<Point>> conPoly(contours.size());vector<Rect>boundRect(contours.size());for (int i = 0; i < contours.size(); i++) {int area = contourArea(contours[i]);cout << area << endl;string objectType;if (area > 1000) {float peri = arcLength(contours[i],true);/*arcLength:这是一个用于计算轮廓周长的函数。它的参数是一个轮廓,以及一个布尔值,用于指示轮廓是否闭合。如果将第二个参数设置为 true,则表示轮廓是闭合的(即起点和终点相连),如果设置为 false,则表示轮廓是开放的。*/approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true);
/*approxPolyDP 函数,它的作用是对给定的轮廓(contour)进行多边形近似(Approximation)。
contours[i]:这表示你要近似的轮廓,即第 i 个轮廓。
conPoly[i]:这是一个用于存储多边形近似结果的变量,通常是一个包含多边形顶点坐标的数据结构,例如数组或列表。
approxPolyDP 函数会将近似的多边形的顶点坐标存储在 conPoly[i] 中。
0.02 * peri:这是近似精度的参数。它控制了多边形近似与原始轮廓之间的相似度。在这里,它被设置为轮廓周长的2%(0.02乘以 peri),这意味着多边形近似会尽量保持原始轮廓的形状,但允许一定的近似误差。
true:这是一个布尔值参数,指示多边形近似是否要考虑轮廓是否闭合。如果设置为 true,则表示轮廓是闭合的,多边形近似也会尝试保持闭合性质。
*/cout << conPoly[i].size() << endl;//输出多边形顶点坐标有几个boundRect[i] = boundingRect(conPoly[i]);/*boundingRect(conPoly[i]):这行代码用于计算多边形 conPoly[i] 的最小边界矩形(bounding rectangle)。这个最小边界矩形是一个矩形,它完全包围了多边形,使得矩形的边与多边形的边平行。这个矩形由一个左上角点的坐标(x,y)和矩形的宽度和高度组成。这个函数会返回这个最小边界矩形,并将其存储到 boundRect[i] 中。之后你可以使用 boundRect[i] 来访问这个矩形的信息,比如左上角坐标、宽度和高度*/int objCor = (int)conPoly[i].size();if (objCor == 3){objectType = "Tri"; }if (objCor == 4) { float asRatio = (float)boundRect[i].width / (float)boundRect[i].height;cout << asRatio << endl;if (asRatio > 0.9 && asRatio < 1.1) { objectType = "Square"; }else { objectType = "Rect"; }}if (objCor > 4) { objectType = "Circle"; }drawContours(img, conPoly, i, Scalar(255, 0, 255), 2);//rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 5);//putText(img, objectType, { boundRect[i].x,boundRect[i].y - 5 }, FONT_HERSHEY_PLAIN, 1, Scalar(0, 69, 255), 2);}}}void main() {string path = "Resources/shapes.png";Mat img = imread(path);//PreprocessingcvtColor(img, imgGray, COLOR_BGR2GRAY);GaussianBlur(imgGray,imgBlur,Size(3,3),3,0);Canny(imgBlur, imgCanny, 25, 75);Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3));dilate(imgCanny, imgDil, kernel);getContours(imgDil,img);imshow("Image", img);/*imshow("Image Gray", imgGray);imshow("Image Blur", imgBlur);imshow("Image Canny", imgCanny);imshow("Image Dil", imgDil);*/waitKey(0); }

Chapter8:人脸检测(Face Detection)

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>#include <opencv2/objdetect.hpp>
/*"Load cascade"(加载级联)是一个在计算机视觉和图像处理中常见的术语。
它通常指的是加载一个级联分类器(Cascade Classifier)模型,用于目标检测或物体识别任务。
级联分类器是一种基于机器学习的方法,用于识别图像中的特定对象或目标。级联分类器通常由多个级别(级联)组成,
每个级别都是一个分类器,用于逐步筛选图像中的区域以识别目标。
每个级别的分类器都可以是基于Haar特征、HOG特征、深度神经网络等不同的技术。
"Load cascade" 意味着将事先训练好的级联分类器模型加载到计算机程序中,
以便在输入图像上执行目标检测。加载后,程序可以使用该级联分类器来检测图像中的特定物体或对象,并返回检测结果,
通常是物体的位置和/或标签。
在常见的应用中,级联分类器常用于人脸检测、行人检测、车辆检测等任务。
加载级联分类器模型是执行这些任务的重要步骤之一,因为它包含了训练好的模型参数,可以用来快速且准确地识别图像中的目标。
*/
using namespace cv;
using namespace std;人脸检测//int main() {string path = "Resources/OIP.jpg";Mat img = imread(path);Mat imgGray, imgBlur, imgCanny, imgDil;//编写级联分类器CascadeClassifier faceCascade;faceCascade.load("Resources/haarcascade_frontalface_default.xml");/*XML是一个级联分类器模型文件,用于人脸检测任务。这个文件包含了一个基于Haar特征的级联分类器,经过训练可以识别图像中的前视人脸。OpenCV(一个广泛使用的计算机视觉库)和其他计算机视觉工具通常提供了这种类型的级联分类器模型文件,以便开发人员可以在自己的应用程序中使用它们来实现人脸检测功能。通过加载这个模型文件,开发人员可以快速在图像或视频流中检测人脸,并获取人脸的位置信息,从而进行进一步的处理或识别任务。*/if (faceCascade.empty()) { cout << "XML file not loaded " << endl;}vector<Rect> faces;//使用人脸级联点检测多尺度方法faceCascade.detectMultiScale(img, faces, 1.1, 10);for (int i = 0; i < faces.size(); i++){rectangle(img,faces[i].tl(),faces[i].br(), Scalar(255,0, 255),2);}cvtColor(img, imgGray, COLOR_BGR2GRAY);//将原始图像转变成灰度图像//接下来添加高斯模糊GaussianBlur(imgGray, imgBlur, Size(7, 7), 5, 0);//将7,7换成3,3后可以明显看出图像模糊的不那么明显//Canny 边缘检测算法Canny(imgBlur, imgCanny, 25, 75);//50,150可以看出边缘不是很清楚,将参数调成25,75,边缘更清楚了//膨胀图像边缘Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));//增大参数,膨胀的会多,减小参数,膨胀的会晓dilate(imgCanny, imgDil, kernel);imshow("Image", img);//imshow("Image Gray", imgGray);//imshow("Image Blur", imgBlur);//显示模糊后的图像//imshow("Image Canny", imgCanny);//imshow("Image Dilation", imgDil);//显示膨胀后的边缘图像waitKey(0); //0表示图片会一直显示不关闭	return 0;
}

后续以后用到了再补上

Project1:(Virtual Painter)

Project2:(Document Scanner)

Project3:(License Plate Detector)

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

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

相关文章

【UE4 反射系统】 UCLAS UFUNCTION UPROPERTY 宏简单解析 持续更新

目录 0 引言1 C如何实现反射机制1.1 使用代码生成工具实现反射机制 2 UE4的反射系统2.1 ****.generated.h头文件2.2 GENERATED_BODY()2.3 反射宏 UCLASS 等2.4 UHT和UBT 3 基本宏的使用3.1 UCLASS3.2 UFUNCTION3.3 UPROPERTY &#x1f64b;‍♂️ 作者&#xff1a;海码007&…

Axure RP医疗在线挂号问诊原型图医院APP原形模板

医疗在线挂号问诊Axure RP原型图医院APP原形模板&#xff0c;是一款原创的医疗类APP&#xff0c;设计尺寸采用iPhone13&#xff08;375*812px&#xff09;&#xff0c;原型图上加入了仿真手机壳&#xff0c;使得预览效果更加逼真。 本套原型图主要功能有医疗常识科普、医院挂号…

美创科技信创数据安全「利基者」!

近日&#xff0c;第一新声研究部正式发布《2023年中国信创网络安全产品竞争力象限》&#xff08;下称“象限报告“&#xff09;。 ◼︎ 象限报告综合考虑企业占有率、在技术/应用上的成熟度、在客户方面的交付完成度及口碑、产品在市场/营销/商业模式/行业拓展等战略上的领先性…

解决Drag and drop is not supported导致无法将物理机上的文件拖入Ubuntu

问题起因 因为需要拷贝一个文件从物理机到虚拟机&#xff0c;但是我又不想用有关ftp的程序或者协议&#xff0c;但是直接拖又报错Drag and drop is not supported&#xff0c;索性上网查询了一下解决方法&#xff0c;自己记录一下。 解决方法 安装下面两个程序 sudo apt in…

python小游戏:小球碰撞

创建带图形界面的游戏通常需要使用图形库。Python有很多图形库&#xff0c;其中比较流行的包括Pygame, PyOpenGL, Panda3D等。在这里&#xff0c;我将用Pygame作为示例来编写一个简单的游戏。 在运行下面的代码之前&#xff0c;请确保你已经安装了Pygame库。你可以使用以下命令…

工控机连接Profinet转Modbus RTU网关与水泵变频器Modbus通讯配置案例

Profinet转Modbus RTU网关是一个具有高性能的通信设备&#xff0c;它能够将工控机上的Profinet协议转换成水泵变频器可识别的Modbus RTU协议&#xff0c;实现二者之间的通信。通过这种方式&#xff0c;工控机可以直接控制水泵变频器的运行状态&#xff0c;改变其工作频率&#…

美格智能SLM927智能模组,轻松打造功能丰富的智能终端

近年来&#xff0c;智能终端加速渗入各行各业&#xff0c;使用场景不断拓展&#xff0c;视觉、听觉、语音、传感等交互能力融入智能终端产品之中&#xff0c;带来涵盖工作和生活各场景的智能化浪潮。 美格智能作为全球领先的无线通信模组及解决方案提供商&#xff0c;深入洞察…

Linux网络编程系列之UDP组播

Linux网络编程系列 &#xff08;够吃&#xff0c;管饱&#xff09; 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

Linux网络-UDP/TCP协议详解

Linux网络-UDP/TCP协议详解 2023/10/17 14:32:49 Linux网络-UDP/TCP协议详解 零、前言一、UDP协议二、TCP协议 1、应答机制2、序号机制3、超时重传机制4、连接管理机制 三次握手四次挥手5、理解CLOSE_WAIT状态6、理解TIME_WAIT状态7、流量控制8、滑动窗口 丢包问题9、拥塞控制…

【Qt-19】按Q退出应用程序

如何将Qt窗口应用程序改成控制台程序呢&#xff1f; 下面进入正文&#xff0c;如何控制控制台程序退出呢&#xff1f; 这里采用线程方式&#xff0c;通过单独线程监视用户输入来执行是否退出程序。 监视线程头文件thread.h #include <QThread> #include "TDRServe…

【ARM裸机】ARM入门

1.ARM成长史 2.ARM的商业模式和生态系统 ARM只设计CPU&#xff0c;但是不生产CPU 3.为什么使用三星&#xff1a;S5PV210 4.各种版本号 0. ARM和Cortex Cortex就是ARM公司一个系列处理器的名称。比如英特尔旗下处理器有酷睿&#xff0c;奔腾&#xff0c;赛扬。ARM在最初的处理器…

[BX]和Loop指令

[BX]和Loop指令 1 描述性符号: “()”2 idata常量3 [BX]4 Loop5 Debug和汇编编译器masm对指令的不同处理6 Loop和[BX]的联合应用7 段前缀 本文属于《 X86指令基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 描述性符号: “()” 我们定义的描述性的符号: "()”&…

【web前端】web前端设计入门到实战第一弹——html基础精华

前端 一&#xff1a;图片属性二&#xff1a;音频标签三&#xff1a; 视频标签四&#xff1a;链接标签五&#xff1a;列表标签5.1.无序列表5.2.有序列表3.自定义列表 六&#xff1a;表格6.1合并单元格 七&#xff1a;input标签八&#xff1a;select系列九&#xff1a; 文本域标签…

python元组、拆包和装包

注意 元组不能修改元素 元组&#xff1a;如果元素为字符串且元素为1个&#xff0c;必须加一个&#xff0c; ********* t1 (aa,) 下标和切片 in not in for ... in ... 元组转为列表 拆包、装包

Android DI框架-Hilt

到底该如何理解<依赖注入> 模版代码&#xff1a;食之无味&#xff0c;弃之可惜 public class MainActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView mTextView(TextView) findVi…

游戏数据分析工具该怎样选择?有哪些选择标准?

选择游戏数据分析工具时&#xff0c;可以考虑以下标准&#xff1a; 1、功能全面性 确保工具提供全面的功能&#xff0c;包括玩家行为分析、性能监测、用户留存率、收入分析等&#xff0c;以满足不同层面的需求。 2、易用性 选择界面友好、易于使用的工具&#xff0c;以确保团…

[PyTorch]即插即用的热力图生成

先上张效果图&#xff0c;本来打算移植霹雳老师的使用Pytorch实现Grad-CAM并绘制热力图。但是看了下代码&#xff0c;需要骨干网络按照标准写法&#xff08;即将特征层封装为features数组&#xff09;&#xff0c;而我写的网络图省事并没有进行封装&#xff0c;改造网络的代价又…

【学习笔记】RabbitMQ-6 消息的可靠性投递2

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 十一、队列Queue的消息属性11.1 具体属性11.2 自动删除11.2 自定义参数11.2.1 **Message TTL** 消息存活时间11.2.2 **Auto expire** 队列自动到期时间11.2.3 **Overflow behaviour** 溢出行为11.2.4…

微信扫码跳转到小程序内部,浏览器扫码跳转到App 内部,如果手机上没有安装App ,跳转到下载页

第一:微信扫普通二维码跳转到小程序 第一步:登录微信公众平台,左侧点击开发管理,点击开发设置,滑到最下边,找到扫普通链接二维码打开小程序,配置对应的二维码链接,注意要拿这个链接去生成二维码,这样微信扫码才能跳转到小程序内部,还有那个校验文件,让后台放到对应的文件夹下,…

c#是不是比qt好找工作些?

c#是不是比qt好找工作些? C#和Qt都是非常流行的编程语言&#xff0c;会对你未来找工作都有一定的帮助。然而&#xff0c;就目前工作市场而言&#xff0c;C#的相关岗位可能更多一些&#xff0c;因为它被广泛用于企业应用开发和微软生态系统中。最近很多小伙伴找我&#xff0c;说…