视觉识别

发布时间 2023-03-30 11:14:55作者: bingcm

视觉识别

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);

  • 合并

绘图函数