OpenCV 利用hsv颜色空间的车牌底色检测

叁歲伎倆 2022-07-14 10:57 271阅读 0赞

一个针对车牌颜色分类的小测试,根据hsv颜色空间,遍历像素点后计算在每个颜色下的像素个数,区分蓝,黄,黑,白车牌底色。

  1. #include<windows.h>
  2. #include<ctime>
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <string>
  6. #include <stdlib.h>
  7. #include "opencv2/objdetect/objdetect.hpp"
  8. #include "opencv2/highgui/highgui.hpp"
  9. #include "opencv2/imgproc/imgproc.hpp"
  10. #include <opencv2/opencv.hpp>
  11. using namespace std;
  12. using namespace cv;
  13. char adr[128]={0};
  14. int main()
  15. {
  16. Mat hsv;
  17. Mat imgH ;
  18. Mat imgS ;
  19. Mat imgV ;
  20. for (int i=57;i<=114;i++)
  21. {
  22. int bluenum=0;
  23. int yellownum = 0;
  24. int whitenum = 0;
  25. int blacknum = 0;
  26. int othernum = 0;
  27. sprintf_s(adr, "C:\\Users\\Administrator\\Desktop\\save\\1 (%d).jpg",i);
  28. printf("-------------------------------------------------------\n");
  29. printf("当前图片为%d张\n",i);
  30. Mat carplate= imread(adr);
  31. cvtColor(carplate,hsv,CV_BGR2HSV);
  32. vector<Mat> channels;
  33. split(hsv, channels);
  34. imgH = channels.at(0);
  35. imgS = channels.at(1);
  36. imgV = channels.at(2);
  37. for (int i=0;i<hsv.rows;i++)
  38. {
  39. for(int j=0;j<hsv.cols;j++)
  40. {
  41. //h通道/-/
  42. uchar hvalue=imgH.at<uchar>(i,j); //
  43. //s通道/-/
  44. uchar svalue=imgS.at<uchar>(i,j); //
  45. //v通道/-/
  46. uchar vvalue=imgV.at<uchar>(i,j); //
  47. // printf("x=%d,y=%d,HSV: H=%d,S=%d,V=%d\n",i,j,hvalue,svalue,vvalue);
  48. if ((hvalue>90&&hvalue<120)&&(svalue>80&&svalue<220)&&(vvalue>80&&vvalue<255))//hsv图像在蓝色区域里
  49. {
  50. //蓝色+1
  51. bluenum++;
  52. }
  53. else if ((hvalue>11&&hvalue<34)&&(svalue>43&&svalue<255)&&(vvalue>46&&vvalue<255))//hsv在黄色区域里
  54. {
  55. //黄色+1
  56. yellownum++;
  57. }
  58. else if ((hvalue>0&&hvalue<180)&&(svalue>0&&svalue<255)&&(vvalue>0&&vvalue<46))//hsv在黑色区域里
  59. {
  60. blacknum++;
  61. //黑色+1
  62. }
  63. else if ((hvalue>0&&hvalue<180)&&(svalue>0&&svalue<30)&&(vvalue>46&&vvalue<220))//hsv在白色区域里
  64. {
  65. //白色+1
  66. whitenum++;
  67. }
  68. else
  69. {
  70. //其他颜色
  71. othernum++;
  72. }
  73. }
  74. }
  75. 四个颜色值找最大值//
  76. if ((bluenum>yellownum)&(bluenum>blacknum)&(bluenum>whitenum)&(bluenum>othernum))
  77. printf("图%d底色为蓝色\n",i);
  78. if ((yellownum>whitenum)&(yellownum>blacknum)&(yellownum>bluenum)&(yellownum>othernum))
  79. printf("图%d底色为黄色\n",i);
  80. if ((whitenum>yellownum)&(whitenum>blacknum)&(whitenum>bluenum)&(whitenum>othernum))
  81. printf("图%d底色为白色\n",i);
  82. if ((blacknum>yellownum)&(blacknum>whitenum)&(blacknum>bluenum)&(blacknum>othernum))
  83. printf("图%d底色为黑色\n",i);
  84. if ((othernum>yellownum)&(othernum>whitenum)&(othernum>bluenum)&(othernum>blacknum))
  85. printf("图%d不是车牌\n",i);
  86. }
  87. getchar();
  88. waitKey(0);
  89. return 0;
  90. }

测试结果如下:
这里写图片描述

测试素材:
这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,271人围观)

还没有评论,来说两句吧...

相关阅读

    相关 颜色空间RGB与HSV(HSL)转换

    一般的3D编程只需要使用RGB颜色空间就好了,但其实美术人员更多的是使用HSV(HSL),因为可以方便的调整饱和度和亮度。 有时候美术需要程序帮助调整饱和度来达到特定风格的渲

    相关 RGB、YUV和HSV颜色空间模型

    一、概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间。但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一