cvUtil.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #pragma once
  2. #include "pch.h"
  3. #include <opencv2/opencv.hpp>
  4. #include <random>
  5. /**
  6. * 获取二值化图像(黑底白字)白色点个数
  7. * @param image 原图
  8. * @return 个数
  9. */
  10. int getWhitePixNumber(cv::Mat& img);
  11. /**
  12. * 开运算&闭运算
  13. * @param image 原图
  14. * @return 个数
  15. */
  16. void openImg(const cv::Mat& lpImgSrc, cv::Mat& lpImgDes, cv::Size sizeErode);
  17. void colseImg(const cv::Mat& lpImgSrc, cv::Mat& lpImgDes, cv::Size sizeErode);
  18. /**
  19. * 保持长宽比不变缩放图像
  20. * @param w,h w=0,则按照h计算新的宽度,反之依然
  21. * @param image 原图
  22. * @return 缩放后的图像
  23. */
  24. cv::Mat scaleImage(int w, int h, cv::Mat& image);
  25. cv::Mat paddingResize(cv::Mat& image, int w, int h);
  26. cv::Mat paddingNoResize(cv::Mat& image, int w, int h);
  27. // 四等分后放入
  28. cv::Mat splitAndInsertImages(const cv::Mat& imageA, const cv::Mat& imageB);
  29. /**
  30. * 获取全部的bbx
  31. * @param img
  32. * @return vector<结果>
  33. */
  34. std::vector<cv::Rect> getAllBoundingBoxes(const cv::Mat& img);
  35. struct Cluster {
  36. cv::Rect rect;
  37. std::vector<int> indices;
  38. };
  39. /**
  40. * 对给定的矩形框进行聚类,按照指定的规则将在高度方向有重叠的矩形框合并为一个。
  41. * @param rectangles 待聚类的矩形框集合
  42. * @return 聚类结果,包含聚类矩形框和对应的矩形框索引
  43. */
  44. std::vector<Cluster> clusterRectangles(const std::vector<cv::Rect>& rectangles);
  45. /**
  46. * 在指定的矩形区域内创建mask蒙版并覆盖到图像上。
  47. * @param image 待操作的图像 (BGR格式)
  48. * @param box 需要蒙版覆盖的区域
  49. * @param alpha 透明度 (0-100之间的值,0为完全透明,100为完全不透明)
  50. * @param useRandColor 是否使用随机颜色 (默认为true)
  51. * @param color 传入指定的颜色 (仅在useRandColor为false时有效)
  52. * @return 覆盖蒙版后的图像
  53. */
  54. void rectangleMask(cv::Mat& image, const cv::Rect& box, int alpha, bool useRandColor = true, const cv::Scalar& color = cv::Scalar());
  55. /**
  56. * 检查并调整矩形框的合法性,确保其在图像内部。
  57. * @param image 输入图像
  58. * @param box 待调整的矩形框,会被修改为在图像内部的合法位置
  59. */
  60. void adjustBoundingBox(const cv::Mat& image, cv::Rect& box);
  61. void adjustBoundingBox(int w,int h, cv::Rect& box);
  62. /**
  63. * 使用opencv自带的函数实现 在指定位置打印要显示的文字,##不支持汉字##
  64. * @param image 输入图像
  65. * @param pos 要显示的位置的左上角顶点
  66. * @param text 要显示的文字内容
  67. * @param width 显示文字的最大宽度,=0则忽略该参数
  68. * @param height 显示文字的高度,函数内根据该参数动态计算字体大小
  69. */
  70. void printText(const cv::Mat& image, const cv::Point &pos,const std::string & text,int height, int width=0 );
  71. /**
  72. * 计算两个cv::Rect的类IOU,返回值 = boxA和boxB的重合面积/boxA面积
  73. * @param boxA
  74. * @param boxB
  75. * @return (boxA∩boxB).area()/boxA.area()
  76. */
  77. double boxSimIOU(cv::Rect boxA, cv::Rect boxB);
  78. /**
  79. * 计算两个cv::Rect在y轴投影的IOU,用于mrege横向重叠的box
  80. * @param boxA
  81. * @param boxB
  82. * @return boxA.width∩boxB.width/boxA.width∪boxB.width
  83. */
  84. double boxVerProjectionSimIOU(cv::Rect boxA, cv::Rect boxB);