视觉识别
yolo模型
mininconda环境配置
GPU需要安装cuda和cunna,不自带的
教程:https://blog.csdn.net/qq_45945548/article/details/121090907
https://www.cnblogs.com/wdysblog/p/16654592.html
https://blog.csdn.net/qq_51208442/article/details/125709001
pyrcc5 -o libs/resources.py resources.qrc这条命令需要pip install PyQt5-tools
conda info --envs#查看当前拥有的虚拟环境
conda activate xxxx #激活虚拟环境
conda create --prefix=C:/ProgramData/Anaconda3/envs/xxxxx python==3.8.2#指定位置创建虚拟环境
#上面那条然并软,conda使用约定优于配置,虚拟环境需要放在canda\envs目录下或者用户的.conda\envs目录下,不然没有名字,没法激活,用作解释器应该行
conda create -n xxxx python==3.8.2#在用户目录下创建虚拟环境
conda remove -n xxxx --all #删除环境
conda deactivate#退出虚拟环境
#教学链接https://blog.csdn.net/adreammaker/article/details/123396951
# 添加指定源
conda config --add channels * #*指代你要添加的源
# 设置安装包时,显示镜像来源,建议显示
conda config --set show_channel_urls yes
# 删除指定源
conda config --remove channels * #*代表你要删除的源
conda config --remove-key channels#删除所有镜像源
遇到的问题
failed with initial frozen solve. Retrying with flexible solve.
-
环境不适配
# 查看版本 conda -V # 更新conda环境 conda update -n base conda # 更新conda的所有包 conda update --all
-
EnvironmentNotWritableError: The current user does not have write permissions to the target environment.
- conda没有设置用户读写权限
OPENCV
基本数据结构
- Vec
- 向量的模板类,和数组差不多用法,可以加减乘除
Vec<double, 19> myVector
一个存储19个double类型向量的容器
- Point
- 表现了二维数组下的点
Point point1; point1.x = 10; point1.y = 8; Point point2 = Point(10, 8 );
- 几个别名
typedef Point_<int> Point2i;//整数类型 typedef Point2i Point; //整数类型 typedef Point_<float> Point2f; //浮点类型 typedef Point_<double> Point2d; //双精度类型
- Scalar
- Vec的派生类,有四个元素,用于传递和读取像素值,只需要三个参数的话写三个就行.
Scalar(b, g, r)
- Size
- 指定图像或矩形的大小,有两个成员width和height,使用area()计算面积
- Rect
- 矩形表示,有成员变量
x,y,width,height
分别表示左上角的坐标和矩形的宽和高
- 矩形表示,有成员变量
Size() //返回值为 Size ;
area() //返回矩形的面积;
contains(Point) //判断点是否在矩形内;
inside(Rect) //函数判断矩形是否在该矩形内;
tl()// 返回左上角点坐标;
br() //返回右下角点坐标。
+ 可以通过`&,|,+`来求矩阵交并集以及移动矩形,同时Rect可以确定图像区域
Mat img = imread("demo.jpg");
Rect r(0, 0, 100, 100);
Mat img_roi = img(r);
- Mat
- 用于表示单通道或多通道的稠密数组,主要用于存储图像
Mat {
public:
---
int dims; //维数
int rows,cols; //行列数
uchar *data; //存储数据的指针
int *refcount; //引用计数
}
- 通道:一个像素点的数据,一通道灰度图,二通道用于数据处理,三通道HSV,RGB,四通道RGBA,加上透明度数据
- mat创建
//创建长宽为2,格式为CV_8UC3,(8位无符号,通道数为3),通道值为(0,0,255)的矩阵;
Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));
//所有通道为0;
Mat Z = Mat::zeros(3, 3, CV_64F);
//第一个通道为1,其余为0;
Mat F = Mat::ones(2, 2, CV_64F);
Mat M0(1,2,CV_8UC3);
float K[3][3] = {1, 0, 1, 0, 1, 1, 0, 0, 1};
Mat M1 = Mat(3,3,CV_32FC1,K);
Mat M2 = (Mat_<float>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
Mat M3 = (Mat_<double>(3, 3) << 0, 1, 2, 1, 2, 3, 2, 3, 4);
基本函数
cvtColor()
void cvtColor(InputArray src,outputArray dst,int code,int dstCn=0)
- 实现颜色空间转换,src:输入,dst:输出,code:转换方式,dstCn:目标通道数(为0取输入通道数)
//此处是显示部分,总体就是加2的事
RGB<->BGR COLOR_RGB2BGRA,COLOR_BGRA2RGBA
RGB<->Gray COLOR_RGB2GRAY,COLOR_GRAY2RGB
RGB<->HSV COLOR_RGB2HSV,COLOR_HSV2RGB
threshold()
double cv::threshold(InputArray src, OutputArray dst, double thres, double maxval, int type)
- src:源图像,dst:输出,thresh:阈值;maxval:处理后灰度最大值;type:操作类型
标记 含义 THRESH_BINARY 灰度值超过阈值的像素设置为最大灰度值,不超过的设置为0 THRESH_BINARY_INV 灰度值不超过阈值的像素设置为最大灰度值,超过的设置为0 THRESH_TOZERO 灰度值低于阀值的像素设为0灰度值 THRESH_TOZERO_INV 灰度值高于阀值的像素设为0灰度值 THRESH_TRUNC 灰度值超过阈值的像素设为阈值的灰度值 THRESH_MASK 掩码 THRESH_OTSU 标记,使用大津算法来选择最佳阈值,只支持8位单通道图像 THRESH_TRIANGLE 标记,使用TRIANGLE算法来算则最佳阈值,只支持8位单通道图像
findContours()
void findContours(InputArray image,OutputArrayOfArrays contours, OutputArray hierarchy,int mode,int method,Point offset = Point())
- image:输入,八位单通道,背景为黑色的二值图像
- contours:输出,每个元素是一个轮廓,轮廓上包含众多点
- hierarchy:各个轮廓之间的继承关系,和contours对应,每个元素有四个整型向量
- mode:检测轮廓的方法
- RETR_EXTERNAL:只检测外轮廓。忽略轮廓内部的洞。
- RETR_LIST:检测所有轮廓,但不建立继承(包含)关系。
- RETR_TREE:检测所有轮廓,并且建立所有的继承(包含)关系。
- RETR_CCOMP:检测所有轮廓,但是仅仅建立两层包含关系。
- method:轮廓的编码信息
- CHAIN_APPROX_NONE:把轮廓上所有的点存储。
- CHAIN_APPROX_SIMPLE:只存储轮廓上的拐点。
- CHAIN_APPROX_TC89_L1,CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
- Point:偏移量,默认0
- 共同食用:
drawContours(
InputOutputArray binImg, // 输出图像
OutputArrayOfArrays contours,// 全部发现的轮廓对象
Int contourIdx// 轮廓索引号,-1表示绘制所有轮廓
const Scalar & color,// 绘制时候颜色
int thickness,// 绘制线宽,-1表示填充轮廓内部
int lineType,// 线的类型LINE_8
InputArray hierarchy,// 拓扑结构图
int maxlevel,// 最大层数, 0只绘制当前的,1表示绘制绘制当前及其内嵌的轮廓
Point offset = Point()// 轮廓位移,可选
)
contourArea(contour, oriented = False) //计算轮廓的面积
//contour为单个轮廓值,oriented为flase时返回面积绝对值,true时,轮廓方向为顺时针则为正,逆时针为负
arcLength(contour, closed) // 计算轮廓的周长
//也是单个轮廓,closed表示是否封闭(true为闭,false为开)
Moments m = moments(contours[t]); //获取轮廓的距
//计算轮廓质心
double cx = m.m10 / m.m00;
double cy = m.m01 / m.m00;
Rect rect = boundingRect(Mat(contours[i]));//获取轮廓外接正矩形
RotatedRect rect = minAreaRect(contours[i]);//获取轮廓最小外接矩形
Point2f P[4];
rect.points(P);//获取四顶点坐标
double pointPolygonTest(InputArray contour,Point2f pt, bool measureDist MeasureDist)
//轮廓点集合
//图像上任一点
//如果是True,则返回每个点到轮廓的距离,如果是False则返回+1,0,-1三个值,其中+1表示点在轮廓内部,0表示点在轮廓上,-1表示点在轮廓外
最小外接圆/拟合圆,拟合椭圆,拟合直线,轮廓凸包,多边形逼近
https://blog.csdn.net/weixin_50016546/article/details/125588721
split()和merge()
-
void split(const Mat& src, Mat*mvbegin);
-
void split(InputArray m,OutputArrayOfArrays mv);
-
两个都是把前一个多通道划分到后几个单通道去
-
void merge(const Mat* mv, size_tcount, OutputArray dst);
-
size_tcount 表示合并后通道数
-
void merge(InputArrayOfArrays mv,OutputArray dst);
-
合并