OpenCV Mat实例详解 六

         本文将接着OpenCV Mat实例详解继续介绍OpenCV Mat类的操作符及公有成员函数。

 Mat &  operator =

        Mat & operator= (const Mat &m)

        将一个Mat对象赋值个另一个Mat对象。

        Mat & operator= (const MatExpr &expr)

         将一个Mat表达式值赋值给Mat对象

         Mat &  operator= (const Scalar &s)

        将一个标量赋值给Mat对象。

        Mat & operator= (Mat &&m)

       是一个移动赋值操作符,它允许你将一个 Mat 对象的资源“移动”到另一个 Mat 对象,而不是进行传统的拷贝。这样做可以节省大量时间和内存,因为资源只是在指针级别上被转移,而不是实际的数据。

        新建一个控制台应用程序,来演示上面赋值操作符的应用方法,在程序中加入如下代码:

// OpenCVMatTest6.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//**********Example for operator = Mat src = imread("1.png");if (src.empty()){cout << "Cann't open the image!" << endl;return -1;}Mat dst = src;imshow("Dst", dst);Mat m1 = (Mat_<uchar>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);Mat m2 = (Mat_<uchar>(3, 3) << 10, 11, 12, 13, 14, 15, 16, 17, 18);MatExpr me = m1.mul(m2, 1);Mat dst1 = me;cout << "dst1:" << endl;cout << dst1 << endl;Mat dst2(5, 5, CV_8UC3);dst2 = Scalar(255, 0, 0);cout << "dst2:" << endl;cout << dst2 << endl;Mat dst3 = move(src);imshow("Dst3", dst3);waitKey(0);return 1;
}

试运行,结果如下: 

void pop_back (size_t nelems=1)

从Mat对象矩阵的底部移除元素,该方法从矩阵底部删除一行或多行。

nelems 移除元素的行数。

void push_back (const _Tp &elem)

将元素添加到Mat对象数据矩阵的底部。这些方法将一个或多个元素添加到矩阵的底部。它们模拟STL向量类的相应方法。当 elem 为 Mat 时,其类型和列数必须与容器矩阵中的相同。

elem 添加的元素

将上面示例程序中无关的代码注释掉,插入新代码来演示上面两个函数的用法,插入的代码如下:

//**********Example for pop_back(),push_back()
Mat m1 = (Mat_<uchar>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
m1.pop_back(1);
cout << "m1 rows after pop back:" << endl;
cout << m1.rows << endl;Mat m2 = (Mat_<uchar>(1, 3) << 11, 11, 11);
m1.push_back(m2);
cout << "m1 rows after push back:" << endl;
cout << m1.rows << endl;
cout << "m1 after push back:" << endl;
cout << m1 << endl;

试运行,结果如下:

数据指针ptr

uchar * ptr (int i0=0)

const uchar *  ptr (int i0=0) const

返回指向指定矩阵行的指针。这些方法返回 uchar* 或指向指定矩阵行的类型化指针。上面两个函数的区别在与接受的参数不同

i0 从0开始的行索引。

重载函数:

        为方便起见OpenCV Mat提供l了很多重载成员函数。它与上述函数的不同之处仅在于它接受的参数。

uchar *  ptr (int row, int col)

const uchar *  ptr (int row, int col) const

uchar *  ptr (int i0, int i1, int i2)

const uchar * ptr  (int i0, int i1, int i2) const

uchar *  ptr (const int *idx)

const uchar *   ptr (const int *idx) const

template<int n>  _Tp * ptr (const Vec< int, n > &idx)

template<int n>   const _Tp *  ptr (const Vec< int, n > &idx) const

template<typename _Tp > _Tp * ptr (int i0=0)

template<typename _Tp >  const _Tp * ptr (int i0=0) const

template<typename _Tp > _Tp *  ptr (int row, int col)

template<typename _Tp > const _Tp * ptr (int row, int col) const

template<typename _Tp > _Tp *  ptr (int i0, int i1, int i2)

template<typename _Tp > const _Tp * ptr (int i0, int i1, int i2) const

template<typename _Tp > _Tp * ptr (const int *idx)

template<typename _Tp > const _Tp * ptr (const int *idx) const

template<typename _Tp , int n> _Tp * ptr (const Vec< int, n > &idx)

template<typename _Tp , int n> const _Tp * ptr (const Vec< int, n > &idx) const

将上面示例程序中无关的代码注释掉,插入新代码来演示上面函数的用法,插入的代码如下:

//*********Example for ptr//uchar* ptr(int i0 =0), cost uchar* ptr(int i0 =0) const
Mat m1(3, 3, CV_8UC1);
for (size_t i = 0; i <3; i++)
{int j = 0;while (j<3){uchar* puchar= m1.ptr(i);puchar[j] = j;j++;}
}
cout << "m1:" << endl;
for (size_t i = 0; i < 3; i++)
{int j = 0;while (j < 3){uchar* puchar = m1.ptr(i);cout << (int)puchar[j] << "  ";j++;}cout << endl;
}//uchar* ptr(int row, int col), const uchar* ptr(int row, int col) const
Mat m2(3, 3, CV_8UC1);for (size_t i = 0; i < 3; i++)
{int j = 0;while (j < 3){uchar* puchar = m2.ptr(i, j);*puchar = j + 1;j++;}
}
cout << "m2:" << endl;
for (size_t i = 0; i < 3; i++)
{int j = 0;while (j < 3){uchar* puchar = m2.ptr(i, j);cout << (int)*puchar << "  ";j++;}cout << endl;
}//ucahr* ptr(int i0, int i1, int in2), const ucahr* ptr(int i0, int i1, int in2) const
Mat m3(5, 5, CV_8UC3);
for (size_t i = 0; i < 5; i++)
{for (size_t j = 0; j < 5; j++){int k = 0;while (k < 3){uchar* puchar = m3.ptr((i, j), k);*puchar = k;k++;}}
}
cout << "m3:" << endl;
for (size_t i = 0; i < 5; i++)
{for (size_t j = 0; j < 5; j++){int k = 0;while (k < 3){uchar* puchar = m3.ptr((i, j), k);cout <<(int)*puchar << "  ";k++;}}cout << endl;
}//uchar* ptr(onst int* idx), const uchar* ptr(onst int* idx) const
Mat m4(5, 5, CV_8UC1);
int idx[] = {0,1,2,3,4};for (size_t i = 0; i < 5; i++)
{uchar* puchar = m4.ptr(idx);int j = 0;while(j < 5){puchar[j] = j;j++;}puchar++;
}
cout << "m4:" << endl;
for (size_t i = 0; i < 5; i++)
{uchar* puchar = m4.ptr(idx);int j = 0;while (j < 5){cout << (int)puchar[j] << " ";j++;}cout << endl;puchar++;
}//​template<int n> _Tp* ptr (const Vec< int, n > &idx), template<int n> ​_Tp* ptr (const Vec< int, n > &idx),​ const _Tp* ptr (const Vec< int, n > &idx) const​
Mat m5(5, 5, CV_8UC1);
Vec<int, 5> vec1 = {0,1,2,3,4};for (size_t i = 0; i < 5; i++)
{uchar* puchar = m5.ptr(vec1);int j = 0;while (j < 5){puchar[j] = 255 -j;j++;}puchar++;
}
cout << "m5:" << endl;
for (size_t i = 0; i < 5; i++)
{uchar* puchar = m5.ptr(vec1);int j = 0;while (j < 5){cout <<(int) puchar[j] << "  ";j++;}puchar++;cout << endl;
}//​template<typename _Tp > _Tp* ptr (int i0 = 0),​ template<typename _Tp >  const _Tp* ptr (int i0 = 0) const
Mat M6(5, 5, CV_8UC1);
for (size_t i = 0; i < 5; i++)
{uchar* puchar = M6.ptr(i);int j = 0;while (j < 5){puchar[j] = 127 - j;j++;}puchar++;
}
cout << "m6:" << endl;
for (size_t i = 0; i < 5; i++)
{uchar* puchar = M6.ptr(i);int j = 0;while (j < 5){cout << (int)puchar[j] <<"  ";j++;}cout << endl;puchar++;
}//​template<typename _Tp > _Tp* ptr (int row, int col), ​template<typename _Tp > const _Tp* ptr (int row, int col) const
Mat m7(3, 3, CV_8UC3);
for (size_t i = 0; i < 3; i++)
{int j = 0;while (j < 3){uchar*  puchar = m7.ptr(i,j);puchar[0] = 255;puchar[1] = 0;puchar[2] = 0;j++;}
}
cout << "m7:" << endl;
for (size_t i = 0; i < 3; i++)
{int j = 0;while (j < 3){uchar* puchar = m7.ptr(i,j);cout <<(int) puchar[0] << "  " << (int)puchar[1] << "  " << (int)puchar[2] << endl;j++;}
}//​template<typename _Tp > _Tp* ptr (int i0, int i1, int i2),  template<typename _Tp >  const _Tp* ptr (int i0, int i1, int i2) const
Mat m8(5, 5, CV_8UC3);
for (size_t i = 0; i < 5; i++)
{for (size_t j = 0; j < 5; j++){int k = 0;while (k < 3){uchar* puchar = m8.ptr((i, j), k);*puchar = k;k++;}}
}
cout << "m8:" << endl;
for (size_t i = 0; i < 5; i++)
{for (size_t j = 0; j < 5; j++){int k = 0;while (k < 3){uchar* puchar = m8.ptr((i, j), k);cout <<(int)*puchar;k++;}}cout << endl;
}//​template<typename _Tp > _Tp* ptr (const int* idx), ​template<typename _Tp > const _Tp* ptr (const int* idx) const
//Mat m9(5, 5, CV_8UC1);
Mat m9 = Mat_<uchar>(5, 5);
int idx1[] = { 0,1,2,3,4 };for (size_t i = 0; i < 5; i++)
{uchar* puchar = m9.ptr(idx1);int j = 0;while (j < 5){puchar[j] = j;j++;}puchar++;
}
cout << "m9:" << endl;
for (size_t i = 0; i < 5; i++)
{uchar* puchar = m9.ptr(idx1);int j = 0;while (j < 5){cout << (int)puchar[j] << " ";j++;}cout << endl;puchar++;
}//​template<typename _Tp, int n> _Tp* ptr (const Vec< int, n > &idx), ​template<typename _Tp, int n> const _Tp* ptr (const Vec< int, n > &idx) const​
//Mat m10(5, 5, CV_8UC1);
Mat m10 = Mat_<uchar>(5, 5);
Vec<int, 5> vec2 = { 0,1,2,3,4 };for (size_t i = 0; i < 5; i++)
{uchar* puchar = m10.ptr(vec2);int j = 0;while (j < 5){puchar[j] = 255 - j;j++;}puchar++;
}
cout << "m10:" << endl;
for (size_t i = 0; i < 5; i++)
{uchar* puchar = m10.ptr(vec2);int j = 0;while (j < 5){cout << (int)puchar[j] << "  ";j++;}puchar++;cout << endl;
}

试运行,结果如下:

       

template<typename _Tp >  std::reverse_iterator< MatIterator_< _Tp > > rbegin ()

template<typename _Tp > std::reverse_iterator< MatConstIterator_< _Tp > > const

template<typename _Tp >  std::reverse_iterator< MatIterator_< _Tp > >  rend ()

template<typename _Tp > std::reverse_iterator< MatConstIterator_< _Tp > >  rend () const

rebegin()与begin()相同,但是反向遍历。

rend()与end()相同,但是反向遍历。 

将上面示例程序中无关的代码注释掉,插入新代码来演示上面函数的用法,插入的代码如下:

//for template<typename _Tp >  ​reverse_iterator< MatIterator_​<_Tp>> rbegin(),rend();
Mat m(3, 3, CV_8UC1);
typedef MatIterator_<uchar> T1;
typedef MatConstIterator_<uchar> T2;reverse_iterator<T1> it1 = m.rbegin<uchar>();
reverse_iterator<T1> it2 = m.rend<uchar>();reverse_iterator<T2> it3 = m.rbegin<uchar>();
reverse_iterator<T2> it4 = m.rend<uchar>();int i = 1;
while (it1 < it2)
{*it1 = i;i++;it1++;
}
cout << "m:  " << endl;
cout << m << endl;
while (it3 <it4)
{cout << (int)*it3 << "  ";it3++;
}
cout << endl;

试运行,结果如下:

 void  release ()

递减参考计数器并取消分配矩阵。

该方法递减与矩阵数据相关联的参考计数器。当引用计数器达到 0 时,矩阵数据被释放,数据和引用计数器指针被设置为 NULL。如果矩阵头指向外部数据集(参见 Mat::Mat ),则引用计数器为 NULL,并且该方法在这种情况下不起作用。

在上面程序中插入以下代码:

试运行,结果如下:

可见输出矩阵为一个空矩阵。

 void reserve (size_t sz)

为一定数量的行保留空间。

该方法为 sz 行保留空间。如果矩阵已经有足够的空间来存储 sz 行,则不会发生任何情况。如果重新分配矩阵,则保留前 Mat::rows 行。该方法模拟STL向量类的相应方法。

sz 行数

void reserveBuffer (size_t sz)

为一定数量的字节保留空间。

该方法保留 sz 字节的空间。如果矩阵已经有足够的空间来存储 sz 字节,则不会发生任何情况。如果必须重新分配矩阵,其先前的内容可能会丢失。

sz 字节数

上面两个程序的调用十分简单,这里就不做实例演示了。

Mat reshape (int cn, int rows=0) const

更改 2D 矩阵的形状和/或通道数,而不复制数据。

Mat reshape (int cn, int newndims, const int *newsz) const

Mat reshape (int cn, const std::vector< int > &newshape) const

后两个函数是重载函数,其作用相似,接受的参数不同。

参数:

cn 新的通道数

rows 新的rows

newndims 新的维度

newsz 所有维度均具有新矩阵大小的数组。如果某些尺寸为零,则假定这些尺寸中的原始尺寸。

newshape  所有维度具有新矩阵大小的向量。如果某些尺寸为零,则假定这些尺寸中的原始尺寸。

注释掉上面程序的无关代码,插入新代码来演示改程序的用法。插入的代码如下:

//for resahpe()
Mat src = imread("1.png");
if (src.empty())
{cout << "Cann't open the image!" << endl;return -1;
}
imshow("src", src);
Mat dst1 = src.reshape(src.channels(), src.rows/2);
imshow("Dst1", dst1);Mat src1 = (Mat_<uchar>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
const int newsz[] = {3, 4};Mat dst2 = src1.reshape(1,2, newsz);
cout << "dst2 cols:"<< dst2.cols << endl;
cout <<"dst2 rows: "<< dst2.rows << endl;
cout << "dst2 channels: "<< dst2.channels() << endl;
cout << "dst2 size: " << dst2.size() << endl;
cout << "dst2 type: " << dst2.type() << endl;Mat src2(Size(2, 2), CV_8UC3, Scalar(1, 2, 3));
vector<int> new_shape{ 4, 3 };
Mat dst3 = src2.reshape(1, new_shape);cout << "dst3 cols:" << dst3.cols << endl;
cout << "dst3 rows: " << dst3.rows << endl;
cout << "dst3 channels: " << dst3.channels() << endl;
cout << "dst3 size: " << dst3.size() << endl;
cout << "dst23 type: " << dst3.type() << endl;

试运行,结果如下:

void resize (size_t sz)

改变矩阵的rows

void resize (size_t sz, const Scalar &s)

改变矩阵的rows及矩阵值

参数 :

sz 新的矩阵rows

s 矩阵的新值。

注释掉上面程序中无关的代码,添加新代码,来演示该函数的用法,添加的新代码如下:

//Example for resize()
Mat src(500, 500, CV_8UC3, Scalar(255, 0, 0));
imshow("src", src);src.resize(300);
imshow("src resied first", src);src.resize(400, Scalar(0, 0, (uchar)255));
imshow("src resied second", src);

试运行,结果如下:

Mat row (int y) const

为指定的矩阵行创建矩阵头,不copy数据

Mat  rowRange (int startrow, int endrow) const

为指定的row跨度创建矩阵头,不copy数据

Mat rowRange (const Range &r) const

为指定的row跨度创建矩阵头,不copy数据

这几个函数与前面讲过的col (int x) const,colRange (int startcol, int endcol) const,colRange (const Range &r) const原理类似前者是针对row,后面针对的是row,这里就不再做演示。

Mat & setTo (InputArray value, InputArray mask=noArray())

将全部或部分数组元素设置为指定值。

This is an advanced variant of the Mat::operator=(const Scalar& s) operator.

参数:

Value 分配的标量转换为实际的数组类型。

mask  与 *this 大小相同的操作掩码。它的非零元素表示哪些矩阵元素需要复制。掩码必须为 CV_8U 类型,并且可以有 1 个或多个通道。

注释掉上面程序中无关的代码,插入新代码,来演示·该·函数的用法,插入代码如下:

//Example for setTo (InputArray value, InputArray mask=noArray())
Mat m1(5, 5, CV_8UC1, Scalar(110));
Mat mask(5, 5, CV_8UC1, Scalar(255));
for (size_t i = 0; i < 5; i++)
{int j = 1;while (j <3){mask.at<uchar>(j, i) = 0;j++;}}
Scalar newVal(115);
m1.setTo(newVal, mask);m1.setTo(newVal, mask);
cout << m1 << endl;

试运行,结果如下:

size_t  step1 (int i=0) const

返回一个标准化步长。

该方法返回除以 Mat::elemSize1() 的矩阵步长。快速访问任意矩阵元素非常有用。

注释掉上面程序中无关代码,插入新代码,来演示该函数的用法,插入代码如下:

//Example for step1()Mat m1(5, 5, CV_8UC3, Scalar(0,0,255));cout << "m1 elmentsize: " << m1.elemSize() << endl;cout << "m1 elmentsize1: " << m1.elemSize1() << endl;cout << "m1 step: " << m1.step << endl;cout << "m1 step1: " << m1.step1() << endl;

试运行,结果如下:

MatExpr      t () const

转置矩阵,即返回该Mat对象数据矩阵的转置矩阵。

注释掉上面演示程序的无关代码,插入新代码,来演示该函数的用法,插入代码如下:

//Example for t()
Mat m1 = (Mat_<uchar>(3,3) <<1,2,3,4,5,6,7,8,9);
cout << "m1:" << endl;
cout << m1 << endl;
Mat m2 = m1.t();
cout << "m2:" << endl;
cout << m2 << endl;

试运行,结果如下:

size_t  total () const 

返回Mat对象数据矩阵element的总数。

size_t  total(int startDim, int endDim=INT_MAX) const

该方法返回某个子数组切片内的元素数量

int   type() const

返回element type

注释掉上面演示程序中无关的代码,插入新代码,演示上面几个函数的用法,插入代码如下:

//Example for total(),type()
Mat m1(10, 10, CV_8UC3,Scalar(0,0,255));
cout <<"m1 total: "<< m1.total() << endl;
cout << "m1  total2: " << m1.total((int)3, (int)9) << endl;
cout << "m1 type: " << m1.type() << endl;

试运行,结果如下:

         到此,OpenCV Mat类的成员函数已介绍完毕。 

        博文示例是基于OpenCV4.8(opencv目录位于d盘根目录下)及VS2022。示例源码已上传到CSDN,其链接为:https://download.csdn.net/download/billliu66/88874033

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

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

相关文章

StarRocks——滴滴OLAP的技术实践与发展方向

原文大佬的这篇StarRocks实践文章整体写的很深入&#xff0c;介绍了StarRocks数仓架构设计、物化视图加速实时看板、全局字典精确去重等内容&#xff0c;这里直接摘抄下来用作学习和知识沉淀。 目录 一、背景介绍 1.1 滴滴OLAP的发展历程 1.2 OLAP引擎存在的痛点 1.2.1 运维…

ArcgisForJS如何将ArcGIS Server发布的点要素渲染为热力图?

文章目录 0.引言1.ArcGIS创建点要素2.ArcGIS Server发布点要素3.ArcgisForJS将ArcGIS创建的点要素渲染为热力图 0.引言 ArcGIS For JS 是一个强大的地理信息系统&#xff08;GIS&#xff09;工具&#xff0c;它允许开发者使用 JavaScript 语言来创建各种 GIS 应用。ArcGIS Ser…

深入探究Python多进程编程:Multiprocessing模块基础与实战【第98篇—Multiprocessing模块】

深入探究Python多进程编程&#xff1a;Multiprocessing模块基础与实战 在Python编程中&#xff0c;多进程处理是一项关键的技术&#xff0c;特别是在需要处理大规模数据或执行耗时任务时。为了充分利用多核处理器的优势&#xff0c;Python提供了multiprocessing模块&#xff0…

Linux之JAVA环境配置jdkTomcatMySQL

目录 一. 安装jdk 1.1 查询是否有jdk 1.2 解压 1.3 配置环境变量 二. 安装Tomcat&#xff08;开机自启动&#xff09; 2.1 解压 2.2 启动tomcat 2.3 防火墙设置 2.4 创建启动脚本&#xff08;设置自启动&#xff0c;服务器开启即启动&#xff09; 三. MySQL安装&#xff08;…

联想开天昭阳N4620Z笔记本如何恢复出厂麒麟操作系统(图解)

联想开天昭阳N4620Z笔记本简单参数&#xff1a; 中央处理器&#xff1a;KX-6640MA G2 内存&#xff1a;8GB 固态硬盘&#xff1a;512GB SSD 显示器&#xff1a;14.0”FHD 电池&#xff1a;4Cell 操作系统&#xff1a;麒麟KOS中文RTM&#xff08;试用版&#xff09; 此款笔…

Unity与Android交互通信系列(5)

在前述文章中&#xff0c;已经使用了AndroidJavaProxy代理接口&#xff0c;本节我们将详细的介绍AndroidJavaProxy代理的用法。正如其名&#xff0c;AndroidJavaProxy是一个代理&#xff0c;它在Android端代码与Unity端代码交互中起一个桥接作用。其一般用法为在Java代码中定义…

网络原理——HTTP

1. 什么是HTTP协议 HTTP是应用层的协议。Java最主要的应用场景是做网站&#xff0c;而网站由 后端&#xff08;HTTP服务器&#xff09; 和 前端&#xff08;浏览器&#xff09;组成&#xff0c;HTTP协议就是负责这里后端和前端的数据交互。 HTTP3.0 之前在传输层是通过 TCP传…

并发编程(5)共享模型之不可变

7 共享模型之不可变 本章内容 不可变类的使用不可变类设计无状态类设计 7.1 日期转换的问题 问题提出 下面的代码在运行时&#xff0c;由于 SimpleDateFormat 不是线程安全的, 有很大几率出现 java.lang.NumberFormatException 或者出现不正确的日期解析结果&#xff0c;…

PyQt5图片浏览器

PyQt5图片浏览器 实现方式功能实现具体代码 界面实现pillow源码修改ImageQt错误主页面布局 项目开源地址 分享一个图片浏览器 实现方式 qt本身有一个QGraphicsView类用来当做视图框架。 具体参考&#xff1a;如何在pyqt中使用 QGraphicsView 实现图片查看器 不过大佬给的例子…

微信小程序 uniapp+vue餐厅美食就餐推荐系统

本论文根据系统的开发流程以及一般论文的结构分为三个部分&#xff0c;第一个部分为摘要、外文翻译、目录&#xff1b;第二个部分为正文&#xff1b;第三个部分为致谢和参考文献。其中正文部分包括&#xff1a; &#xff08;1&#xff09;绪论&#xff0c;对课题背景、意义、目…

eBPF实践篇之基础概念

文章目录 前言基本概念eBPF的生命周期之旅最后 前言 eBPF 是一门革命性的技术&#xff0c;可以在不修改内核源代码或者加载内核模块的情况下&#xff0c;安全和高效地拓展和增强Linux内核的功能&#xff0c;我们主要聚焦在eBPF在网络传输上的应用和实践&#x1f680; 基本概念…

AI时代显卡如何选择,B100、H200、L40S、A100、H100、V100 含架构技术和性能对比

AI时代显卡如何选择&#xff0c;B100、H200、L40S、A100、H100、V100 含架构技术和性能对比。 英伟达系列显卡大解析B100、H200、L40S、A100、A800、H100、H800、V100如何选择&#xff0c;含架构技术和性能对比带你解决疑惑。 近期&#xff0c;AIGC领域呈现出一片繁荣景象&a…

企业型多域名SSL证书

多域名SSL证书是目前市场上用的比较多的一种&#xff0c;主要解决多个不同规则的域名申请&#xff0c;但不适合主域名&#xff08;根域名&#xff09;相同的域名&#xff0c;因为这种域名直接申请通配符。 企业型其实就是OV类型或者EV类型&#xff0c;由于在CA/B产品名称规范中…

【k8s资源调度-HPA(自动扩缩容)】

1、HPA可以做什么&#xff1f; 通过观察pod的cpu、内存使用率或自定义metrics指标进行自动的扩容或缩容pod的数量。通常用于Deployment&#xff0c;不适用于无法扩/缩容的对象&#xff0c;如DaemonSet。控制管理器每隔30s(可以通过-horizontal-pod-autoscaler–sync-period修改…

Ubuntu20.04和Windows11下配置StarCraft II环境

1.Ubuntu20.04 根据下面这篇博客就可以顺利安装&#xff1a; 强化学习实战(九) Linux下配置星际争霸Ⅱ环境https://blog.csdn.net/weixin_39059031/article/details/117247635?spm1001.2014.3001.5506 Ubuntu下显示游戏界面目前还没有解决掉。 大家可以根据以下链接看看能…

Jenkins详解

目录 一、Jenkins CI/CD 1、 Jenkins CI/CD 流程图 2、介绍 Jenkins 1、Jenkins概念 2、Jenkins目的 3、特性 4、产品发布流程 3、安装Jenkins 1、安装JDK 2、安装tomcat 3.安装maven 4安装jenkins 5.启动tomcat&#xff0c;并页面访问 5.添加节点 一、Jenkins CI/…

[深度学习]yolov9+bytetrack+pyqt5实现目标追踪

【简介】 目标追踪简介 目标追踪是计算机视觉领域中的一个热门研究方向&#xff0c;它涉及到从视频序列中实时地、准确地跟踪目标对象的位置和运动轨迹。随着深度学习技术的快速发展&#xff0c;基于深度学习的目标追踪方法逐渐展现出强大的性能。其中&#xff0c;YOLOv9&…

web安全学习笔记【16】——信息打点(6)

信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等[1] #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-C…

K线实战分析系列之一:标准K线图的识别

K线实战分析系列之一&#xff1a;标准K线图的识别 一、阳线和阴线二、光头K线三、光脚K线四、光头光脚大阳线五、纺锤线六、十字线 一、阳线和阴线 二、光头K线 如果某根K线没有上影线&#xff0c;就叫它光头k线 三、光脚K线 某一根K线没有下影线就叫它光脚K线 四、光头光…

广联达Linkworks GetAllData 信息泄露漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…