OpenCV的常用数据类型
OpenCV涉及的常用数据类型除包含C++的基本数据类型,如:char、uchar,int、unsigned int,short 、long、float、double等数据类型外, 还包含Vec,Point、Scalar、Size、Rect、RotatedRect、Mat等类。C++中的基本数据类型不需再做说明下面重点介绍一下OpenCV中特有的与数据或数据处理相关的常用类。
Vec类
Vec类是表示固定长度向量的模板类。它与vector相似,如初始化,元素访问等,与vector不同的是: 因Vec试固定长度向量模板类,在声明实例化时对象时,除指定类型外,还得指定长度,在声明vector实例化对象时,除需指定类型外,长度则不是必需的。另外,Vec对象除可以赋值运算符外,Vec对象还可以直接参与“算术运算”,而vector对象虽然可以使用赋值运算符,但不能直接参与“算术运算”。
OpenCV中已经预定义了多个可以直接使用的Vec类型别名,如下:
typedef Vec< uchar, 2 > cv::Vec2b
typedef Vec< uchar, 3 > cv::Vec3b
typedef Vec< uchar, 4 > cv::Vec4b
typedef Vec< short, 2 > cv::Vec2s
typedef Vec< short, 3 > cv::Vec3s
typedef Vec< short, 4> cv::Vec4s
typedef Vec< ushort, 2 > cv::Vec2w
typedef Vec< ushort, 3> cv::Vec3w
typedef Vec< ushort, 24> cv::Vec4w
typedef Vec< int, 2 > cv::Vec2i
typedef Vec< int, 3 > cv::Vec3i
typedef Vec< int, 4 > cv::Vec4i
typedef Vec< int, 6 > cv::Vec6i
typedef Vec< int, 8> cv::Vec8i
typedef Vec< float, 2 > cv::Vec2f
typedef Vec< float, 3 > cv::Vec3f
typedef Vec< float, 4> cv::Vec4f
typedef Vec< float, 6 > cv::Vec6f
typedef Vec< double, 2 > cv::Vec2d
typedef Vec< double, 3> cv::Vec3d
typedef Vec< double, 4 > cv::Vec4d
typedef Vec< double, 6 > cv::Vec6d
现在以实例演示一下Vector与Vec用法上的区别。下面程序,编译是不会出错的。
如果修改一下,加入算术运算代码, 如下:
可以看出·还没有编译,就·有·错误·提示·,说明vector对象·是不可以与常数相乘的。
Vec类型对象可以与标量进行乘除,下面的程序则可以通过编译,不会报错:
该程序试运行,结果如下:
需注意的是,Vec对象的算术运算并非真正数学上的算术运算,只是重载了算术运算符。Vec实例化对象可以被标量乘或除,结果是Vec对象的每一个元素都被标量乘或除。Vec对象可以做乘数、被乘数、被除数,但不可做除数。下面是一个Vec与标量乘、除的示例程序代码:
试运行,结果如下:
Vec对象间可以做“+”、“-”运算,运算的Vec对象的类型及长度须相同。下面是一个Vec对象“+”、“-”运算的示例程序:
试运行,结果如下:
Vec对象的乘积 Vec对象可以相乘,存在乘积、点积与叉积之分。Vec对象要进行乘运算也需类型与长度相同,不符合乘法交换律。下面是一个Vec对象相乘、点积、差积的示例程序:
试运行,结果如下:
Point(点)类
Ponit类也是一个模版类.
template<typename _Tp>
class cv::Point_< _Tp >
Template class for 2D points specified by its coordinates x
and y
.
template<typename _Tp>
class cv::Point3_< _Tp >
Template class for 3D points specified by its coordinates x
, y
and z
.。
Point类与MFC中的CPoint类似,OpenCV的Point类可以看作是存放2个或3个int或float值的容器,Point包含的值即点的坐标。点有二维点与三位点,OpenCV中按数据Point类型不同及维度不同预定义了:Point、Point2d、Point2i,Point2f、Pointe3d、Point3i、Point3f。
typedef Point_<int> cv::Point2i
typedef Point_<float> cv::Point2f
typedef Point_<double> cv::Point2d
typedef Point2i cv::Point
typedef Point3_<double> cv::Point3d
typedef Point3_<float> cv::Point3f
typedef Point3_<int> cv::Point3i
Point对象可以先声明再赋值,也可用构造函数构造Point对象并初始化。Point 也可被标量乘除、Point对象间也可加减、Point对象间也可求叉积、点积。下面以实例演示Point对象声明、初始化、及其它运算。下面是演示程序的代码:
// OpenCVBaseData.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Point p1;p1.x = 100;p1.y = 100;Point p2(200, 100);Point2d p2d1(100,127);Point2d p2d2(10, 123);Point2i p2i1(500, 350);Point2i p2i2(00, 310);Point2f p2f1(13.5, 24.7);Point2f p2f2(350.0, 270.3);Point3d p3d1(15, 25, 35);Point3d p3d2(55, 85, 0);Point3i p3i1(351, 227, 158);Point3i p3i2(11, 127, 18);Point3f p3f1(153.5, 163.1, 191.9);Point3f p3f2(1003, 2465, 381);Point p3,p4;Point2d p2d3, p2d4;Point2i p2i3, p2i4;Point2f p2f3, p2f4;Point3d p3d3, p3d4;Point3i p3i3, p3i4;Point3f p3f3, p3f4;p3 = p1 + p2;cout << "p3:" << endl;cout << p3 << endl;p4 = p1 * 2;cout << "p4:" << endl;cout << p4 << endl;cout << p1.dot(p2) << endl;cout << p4.cross(p1) << endl;cout << p4.ddot(p2) << endl;p2d3 = p2d1 / 2;p2d4 = p2d1 - p2d2;cout << "p2d3:" << endl;cout << p2d3 << endl;cout << "p2d4:" << endl;cout << p2d4 << endl;cout << p2d4.ddot(p2d1) << endl;cout << p2d4.dot(p2d1) << endl;cout << p2d4.cross(p2d1) << endl;p2i3 = p2i1 / 2;p2i4 = p2i1 - p2i2;cout << "p2i3:" << endl;cout << p2i3 << endl;cout << "p2i4:" << endl;cout << p2i4 << endl;cout << p2i4.ddot(p2i1) << endl;cout << p2i4.dot(p2i1) << endl;cout << p2i4.cross(p2i1) << endl;p2f3 = p2i1 / 2;p2f4 = p2i1 - p2i2;cout << "p2f3:" << endl;cout << p2f3 << endl;cout << "p2f4:" << endl;cout << p2f4 << endl;cout << p2f4.ddot(p2f1) << endl;cout << p2f4.dot(p2f1) << endl;cout << p2f4.cross(p2f1) << endl;p3d3 = p3d1 / 2;p3d4 = p3d1 - p3d2;cout << "p3d3:" << endl;cout << p3d3 << endl;cout << "p3d4:" << endl;cout << p3d4 << endl;cout << p3d4.ddot(p3d1) << endl;cout << p3d4.dot(p3d1) << endl;cout << p3d4.cross(p3d1) << endl;p3i3 = p3i1 / 2;p3i4 = p3i1 - p3i2;cout << "p3i3:" << endl;cout << p3i3 << endl;cout << "p3i4:" << endl;cout << p3i4 << endl;cout << p3i4.ddot(p3i1) << endl;cout << p3i4.dot(p3i1) << endl;cout << p3i4.cross(p3i1) << endl;p3f3 = p3i1 / 2;p3f4 = p3i1 - p3i2;cout << "p3f3:" << endl;cout << p3f3 << endl;cout << "p3f4:" << endl;cout << p3f4 << endl;cout << p3f4.ddot(p3f1) << endl;cout << p3f4.dot(p3f1) << endl;cout << p3f4.cross(p3f1) << endl;waitKey(0);return 0;
}
试运行,结果如下:
OpenCV的点对象加、减运算需是相同类型及相同维度,而叉积与点积运算,则需是相同维度的Point才能进行。
Scalar(标量)类
Scalar类(标量类)实际上是一个四维双精度向量类。Scalar的公有成员函数如下:
Scalar ()=default
Scalar (double v0)
Scalar (double v0, double v1, double v2=0, double v3=0)
const double & operator[] (int i) const
double & operator[] (int i)
前三个为构造函数,后面两个为[]操作符重载函数。
Scalar有一个静态工有成员函数,如下:
static Scalar all (double v0)
Scalar有一个公有属性,如下:
double val [4] = {0}
下面以实例演示Scalar对象创建,及公有属性的访问等。示例程序的代码如下:
// OpenCVBaseData.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Scalar s1= Scalar();Scalar s2;s1[0] = 125;s1[1] = 125;s1[2] = 125;s1[3] = 0;s2 = s1.all(111);cout << "s1; " << s1 << endl;cout << "s2; " << s2 << endl;Scalar s3(127.0);cout << "s3; " << s3 << endl;Scalar s4(120,255,110,0);cout << "s4; " << s4 << endl;double d1, d2;d1 = s4.val[0];d2 = s4[3];cout << "d1: " << d1 <<endl;cout << "d2: " << d2 << endl;waitKey(0);return 0;
}
试运行,结果如下:
Size(尺寸)类
Size类比较简单,它有两个公有属性变量width、height。Size类重载了赋值操作符“=”。Size类的构造函数如下:
Size ()=default
Size (int _width, int _height)
Size (const cv::Size &other)
Size因数据类型不同又可细分为:Size2d,Size2i,Size2f。下面以实例演示Size对象声明及初始化等操作。实例程序代码如下:
// OpenCVBaseData.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Size s1 = Size();s1.width = 100;s1.height = 150;Size s2(110, 330);Size s3(s1);cout << "s1: " << s1 << endl;cout << "s2: " << s2 << endl;cout << "s3: " << s3 << endl;Size2d s2d1(100,200);Size2i s2i1(1000, 2000);Size2f s2f1(1.00, 2.00);cout << "s2d1: " << s2d1 << endl;cout << "s2i1: " << s2i1 << endl;cout << "s2f1: " << s2f1 << endl;waitKey(0);return 0;
}
试运行,结果如下:
Rect(矩形)类
Rect类中以矩形的左上角坐标及矩形宽度与高度来定义一个矩形。Rect类共有4个公有属性变量:int x,int y,int _width, int _height。Rect类重载了赋值操作符“=”。Rect类的构造函数如下:
Rect ()=default
Rect (int _x, int _y, int _width, int _height)
Rect (const cv::Rect &other)
因数据类型不同,同样也有Rect2d,Rect2i,Rect2f。
可是用Point类的inside函数判定一个点是否在矩形内。下面以实例演示,Rect类对象声明、初始化等。示例程序的代码如下:
// OpenCVBaseData.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Rect rec1(0, 0, 100, 100);Rect rec2(rec1);Rect rec3 = rec2;cout << "rec1: " << endl;cout << "x: " << rec1.x << " " << "y: " << rec1.y << " " << "width: " << rec1.width << " " << "height: " << rec1.height << endl;cout << "rec2: " << endl;cout << "x: " << rec2.x << " " << "y: " << rec2.y << " " << "width: " << rec2.width << " " << "height: " << rec2.height << endl;Rect2d rec2d1(0, 0, 233, 233);Rect2i rec2i1(0, 0, 500, 500);Rect2f rec2f1(0, 0, 235.1, 500.0);Point p1(50, 250);if (p1.inside(rec2d1))cout << "p1 is inisde of rec2d1 " << endl;elsecout << "p1 is not inisde of rec2d1 "<< endl;if (p1.inside(rec2i1))cout << "p1 is inisde of rec2i1 " << endl;elsecout << "p1 is not inisde of rec2i1 " << endl;if (p1.inside(rec2f1))cout << "p1 is inisde of rec2f1 " << endl;elsecout << "p1 is not inisde of rec2f1 " << endl;waitKey(0);return 0;
}
试运行,结果如下:
Rect对象可以进行“==”判定,“|”运算、“&”运算。下面以实例做演示,演示代码如下:
// OpenCVBaseData.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Rect rec1(0, 0, 300, 300);Rect rec2(100, 100, 500, 500);if (rec1 == rec2)cout << "rec1 equals rec2" << endl;elsecout << "rec1 does not equal rec2" << endl;Rect rec3 = rec1 & rec2;cout << rec3 << endl;Rect rec4 = rec1 | rec2;cout << rec4 << endl;waitKey(0);return 0;
}
试运行,结果如下:
RotatedRect(旋转矩形)类
RotatedRect类与Rect类的不同点是,Rect类所表示的矩形是水平放置的,而RotatedRect类所表示的矩形则是以任意角度放置的,相当于在Rect表示的矩形基础上再旋转一个角度。
RotatedRect类的公有成员函数有一下几个:
RotatedRect ()
RotatedRect (const Point2f ¢er, const Size2f &size, float angle)
参数:center 矩形的质心,size 矩形的长宽尺寸,angle 旋转角度(顺时针方向旋转)
RotatedRect (const Point2f &point1, const Point2f &point2, const Point2f &point3)
参数: point1 矩形的第一个点,point2 矩形的第二个点,point3 矩形的第三个点,
Rect boundingRect () const
返回包含旋转矩形对象所表示旋转矩形的最小矩形,数据类型为int
Rect<float> boundingRect2f () const
返回包含旋转矩形对象所表示旋转矩形的最小矩形,数据类型为float
void points (Point2f pts[]) const
用旋转矩形对象所表示矩形的角点填充Point2f 点数组
void points (std::vector< Point2f > &pts) const
用旋转矩形对象所表示矩形的角点填充Point2f 点数组
RotatedRect类的公有属性成员变量有一下几个:
float angle 旋转角度,以度表示
Pointe2f center 矩形的质心
Size2f size 代表矩形长宽的尺寸
下面以实例演示RotatedRect对象构造及其它成员函数的用法。示例代码如下:
#include<opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main()
{Mat background(600, 1200, CV_8UC3, Scalar(127, 127, 127));string vertex_names[4] = { "1","2","3","4" };Point2f vertices[4];RotatedRect rRect = RotatedRect(Point2f(600, 300), Size2f(100, 50), 30);rRect.points(vertices);for (size_t i = 0; i < 4; i++){line(background, vertices[i], vertices[(i + 1) % 4], Scalar(0, 0, 255), 1);putText(background, vertex_names[i], vertices[i], FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0));}//Rect rec = rRect.boundingRect();Rect2f rec = rRect.boundingRect2f();rectangle(background, rec, Scalar(255, 0, 0), 1, 8, 0);imshow("Image", background);RotatedRect rRect1(Point2f(100, 100), Point2f(400, 100), Point2f(400, 300));cout <<"rRect1 angle: "<< rRect1.angle << endl;cout << "rRect1 center: " << rRect1.center << endl;cout << "rRect1 size" << rRect1.size << endl;waitKey(0);return 0;
}
试运行,结果如下:
Mat 类
Mat类在前面的文章中已经详细介绍这里不再做说明。这里介绍一下Mat对象矩阵数据的位操作及矩阵运算。假如一个Mat对象存储了一副RGB图像,如何获取或改变图像中某一像素的值呢?要做到这一点可以用以下几种
1. 使用Mat类的成员函数at。
2,使用Mat内部数据指针ptr。
3. 使用Mat的数据矩阵的数据指针data。
4. 使用迭代器
下面用一个实例来演示以上几种Mat数据位操作方法。示例代码如下:
// OpeCVSharp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}cout <<"src.cols:" << src.cols << endl;cout << "src.rows:" << src.rows << endl;cout << "src channels:" << src.channels() << endl;cout << "src type:" << src.type() << endl;//获取第0排0列像素BGR值uchar b = src.at<uchar>((0, 0), 0);uchar g = src.at<uchar>((0, 0), 1);uchar r = src.at<uchar>((0, 0), 2);cout << "BGR:" << (int)b << " " << (int)g << " " << (int)r << endl;uchar* puchar = src.ptr(0, 0);uchar b1 = puchar[0];uchar g1 = puchar[1];uchar r1 = puchar[2];cout << "BGR:" << (int)b1 << " " << (int)g1 << " " << (int)r1 << endl;uchar b2 = src.data[0];uchar g2 = src.data[1];uchar r2 = src.data[2];cout << "BGR:" << (int)b2 << " " << (int)g2 << " " << (int)r2 << endl;//改变第0排0列像素BGR值src.at<uchar>((0, 0), 0) = 0;src.at<uchar>((0, 0), 1) = 0;src.at<uchar>((0, 0), 1) = 255;/*puchar[0] = 0;puchar[0] = 1;puchar[0] = 255;*//*src.data[0] =0;src.data[1] = 0;src.data[2] =255;*///imshow("src", src);waitKey(0);return 0;
}
试运行,结果如下:
Mat对象实质上是数据矩阵,当然可以进行矩阵运算。这里不做全面介绍,仅介绍两个有趣的运算,与常数相乘及与常数向加。
先用实例演示与常数相乘,示例代码如下:
// OpeCVSharp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}cout <<"src.cols:" << src.cols << endl;cout << "src.rows:" << src.rows << endl;cout << "src channels:" << src.channels() << endl;cout << "src type:" << src.type() << endl;imshow("src", src);src *= 1.5;imshow("src new", src);src *= 0.5;imshow("src new1", src);waitKey(0);return 0;
}
试运行,结果如下:
可以看出存有图像的Mat对象乘以一个大于1的常数将使图像变亮,乘以一个小于1的常数使图像变暗。不难想象,该Mat对象除以一个常数将会发生什么现象。
再演示一下Mat对象加、减以一个常数,示例代码如下:
// OpeCVSharp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}cout <<"src.cols:" << src.cols << endl;cout << "src.rows:" << src.rows << endl;cout << "src channels:" << src.channels() << endl;cout << "src type:" << src.type() << endl;imshow("src", src);src += 20;imshow("src new", src);src -= 40;imshow("src new1", src);waitKey(0);return 0;
}
试运行,结果如下:
可以看出,加一个常数使图像变得更蓝,减以一个常数使图像变黄,说明加、减都作用在像素的B通道上。 上面是用彩色图做演示,如果把彩色图转换成灰度图结果又会如何呢?再用实例演示一下,下面是演示的示例代码:
// OpeCVSharp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}cout <<"src.cols:" << src.cols << endl;cout << "src.rows:" << src.rows << endl;cout << "src channels:" << src.channels() << endl;cout << "src type:" << src.type() << endl;// imshow("src", src);cvtColor(src, src, COLOR_BGR2GRAY);imshow("src", src);src += 60;imshow("src new", src);src -= 80;imshow("src new1", src);waitKey(0);return 0;
}
试运行,结果如下:
可以看出,对含灰度图的Mat对象加一个 正数,图像会变量,减一个正数图像会变暗。
下面再演示一下使用迭代器是图像变亮,示例代码如下:
// OpeCVSharp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src = imread("1.jpg");if (src.empty()){cout << "Cann't load image!" << endl;return -1;}imshow("src", src);/*Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);filter2D(src, src, src.depth(), kernel);imshow("src new", src);*///让图像变亮MatIterator_<Vec3b> itstart = src.begin<Vec3b>();MatIterator_<Vec3b> itend = src.end<Vec3b>();int temp = src.rows * src.cols;for (; itstart != itend; itstart++){(*itstart)[0] = saturate_cast<uchar>((*itstart)[0] + 50);(*itstart)[1] = saturate_cast<uchar>((*itstart)[1] + 50);(*itstart)[2] = saturate_cast<uchar>((*itstart)[2] + 50);}imshow("src new", src);waitKey(0);return 0;
}
试运行结果如下:
本文到此结束,示例是基于OpenCV4.8(opencv目录位于d盘根目录下)及VS2022。
相关文章:

OpenCV的常用数据类型
OpenCV涉及的常用数据类型除包含C的基本数据类型,如:char、uchar,int、unsigned int,short 、long、float、double等数据类型外, 还包含Vec,Point、Scalar、Size、Rect、RotatedRect、Mat等类。C中的基本数据类型不需再做说明下面重点介绍一下…...

STM32串口通信—串口的接收和发送详解
目录 前言: STM32串口通信基础知识: 1,STM32里的串口通信 2,串口的发送和接收 串口发送: 串口接收: 串口在STM32中的配置: 1. RCC开启USART、串口TX/RX所对应的GPIO口 2. 初始化GPIO口 …...

《汇编语言》第3版 (王爽) 第14章
第14章 端口 检测点14.1 (1).编程,读取CMOS RAM的2号单元的内容。 mov al,2 ;向al写入2 out 70,al ;将2送入端口70h in al,71 ;从端口71h读取2号单元的内容在CMOS RAM中用6个字节存放当前时间(以BCD码形式存放)&…...

Axure原型设计项目效果 全国职业院校技能大赛物联网应用开发赛项项目原型设计题目
目录 前言 一、2022年任务书3效果图 二、2022年任务书5效果图 三、2022年国赛正式赛卷 四、2023年国赛第一套样题 五、2023年国赛第二套样题 六、2023年国赛第三套样题 七、2023年国赛第四套样题 八、2023年国赛第七套样题 九、2023年国赛正式赛题(第八套…...

力扣串题:字符串中的第一个唯一字母
映射做法:将字母转为数字之类的转化必须在运算中实现如-a int firstUniqChar(char * s){int a[26] {0};int len strlen(s);int i;for (i 0; i < len; i)a[s[i] - a];for (i 0; i < len; i) {if (a[s[i] - a] 1)return i;}return -1; }...

【五、接口自动化测试】GET/POST 请求区别
大家好,我是山茶,一个探索AI 测试的程序员 在网上看到了许多关于post与get之间区别的帖子,也有很多帖子是直接粘贴复制的,甚至连标题、符号都没改,甚至还有很多争议 一、post、get 关于post与get之间区别,…...
HDOJ 2036
改革春风吹满地 Problem Description “ 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地。 谢谢!(乐队奏乐)” 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾…...

2.案例、鼠标时间类型、事件对象参数
案例 注册事件 <!-- //disabled默认情况用户不能点击 --><input type"button" value"我已阅读用户协议(5)" disabled><script>// 分析:// 1.修改标签中的文字内容// 2.定时器// 3.修改标签的disabled属性// 4.清除定时器// …...
OPENCV(0-1之0.0)
OPENCV 第1周:基础知识和安装目标内容 第2-3周:图像处理基础目标内容 第4-5周目标内容 第6-7周目标内容 第8周及以后目标内容 时间安排如下: 第1周:基础知识和安装 目标 了解计算机视觉的基本概念,安装OpenCV&#x…...

easyrecovery破解版百度云(含Mac/Win版)以及EasyRecovery可以恢复哪些设备
软件介绍 当不小心将回收站的文件删除了怎么办?想找回但是不知道怎么找回需要的数据文件?别担心今天小编就为大家介绍一款非常专业的电脑数据文件恢复工具,easyrecovery14是由Ontrack专为电脑用户推出的一款专业的数据恢复软件&…...
[2023年]-hadoop面试真题(一)
(北京)HDFS底层存储原理? (北京) HDFS读写数据流程? (北京) HDFS如何管理元数据或者checkpoint的理解 ? (北京) HDFS常用命令 ? (北京) hadoop调优 (北京) HDFS扩容原理 (北京) HDFS有哪些进程,分别是什么? (北京) HDFS中大量小文件对…...
Kubernetes kafka系列 | k8s部署kafka+zookeepe集群
一、kafka.zookeeper介绍 Kafka 简介: Apache Kafka 是一个开源的分布式流处理平台和消息队列系统。它最初由LinkedIn开发,并于2011年成为Apache软件基金会的顶级项目。 特点: 高吞吐量: Kafka 能够处理大规模的消息流…...

ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播
ip广播智慧工地广播喊话号角 IP网络号角在塔吊中应用 通过寻呼话筒预案广播 SV-704XT是深圳锐科达电子有限公司的一款壁挂式网络有源号角,具有10/100M以太网接口,可将网络音源通过自带的功放和号角喇叭输出播放,可达到功率50W。SV-704XT内置有…...

B端系统优化,可不是换个颜色和图标,看看与大厂系统的差距。
、不要被流于表面的需求描述迷惑。 很多人找我们优化系统界面,对需求总是轻描淡写,比如:换个颜色、换个图标、换个皮肤,甚至还有的说,随便改下就行。 这些需求都是听起来简单,实现起来难,你如…...

【LeetCode热题100】240. 搜索二维矩阵 II
一.题目要求 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 ‘每列的元素从上到下升序排列。 二.题目难度 中等 三.输入样例 示例 1: 输入:matrix [[1,4,7…...

three.js 鼠标左右拖动改变玩家视角
这里主要用到了 一个方法 obj.getWorldDirection(); obj.getWorldDirection()表示的获取obj对象自身z轴正方向在世界坐标空间中的方向。 按下 W键前进运动; <template><div><el-container><el-main><div class"box-card-left…...
Pycharm jupyter server process exited with code 1
Pycharm jupyter server process exited with code 1 1. 问题描述2. 原因和解决方法 1. 问题描述 使用 Pycharm 启动 Jupyter 时,报错如下, jupyter server process exited with code 12. 原因和解决方法 Pycharm 启动 jupyter 时,默认的 …...
ubuntu 20.04 Python pip 配置 pip.conf
1. 状况描述 $ pip install timm WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ProxyError(Cannot connect to proxy., RemoteDisconnected(Remote end closed connection without response)): /simple/t…...

GPT-4.5 Turbo意外曝光,最快明天发布?OpenAI终于要放大招了!
大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…...
Ubuntu 中 desktop-amd64 和 live-server-amd64 的区别
一、Ubuntu的操作系统镜像 Ubuntu的操作系统镜像主要有两种:desktop-amd64和live-server-amd64 这两者的主要区别在于使用场景和安装方式 1. Desktop-amd64: * 这是Ubuntu的桌面版本,用于安装具有图形用户界面的Ubuntu系统。 * 它包含了用于日常使…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...