一、功能
這里的需求是,判斷攝像頭有沒有被物體遮擋。這里只考慮用手遮擋---->判斷黑色顏色的范圍。
二、使用OpenCV的Mat格式圖片遍歷圖片
下面代碼里,傳入的圖片的尺寸是640*480,判斷黑色范圍。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
/ * 在圖片里查找指定顏色的比例 * / int Widget::Mat_color_Find(QImage qimage) { Mat image = QImage2cvMat(qimage); / / 將圖片加載進來 int num = 0 ; / / 記錄顏色的像素點 float rate; / / 要計算的百分率 / / 遍歷圖片的每一個像素點 for ( int i = 0 ; i < image.rows;i + + ) / / 行數(shù) { for ( int j = 0 ; j <image.cols;j + + ) / / 列數(shù) { / / 對該像素是否為指定顏色進行判斷 BGR 像素點 / / OpenCV 中 MAT類的默認三原色通道順序BGR / * 動態(tài)地址訪問像素語法:image.at<Vec3b>(i,j)[ 0 ]、image.at<uchar>(i, j) 訪問三通道圖像的單個像素: int b = image.at<Vec3b>(i, j)[ 0 ]; int g = image.at<Vec3b>(i, j)[ 1 ]; int r = image.at<Vec3b>(i, j)[ 2 ]; 對于三通道圖像,每個像素存儲了三個值,分別為藍色、綠色、紅色通道上的數(shù)值。 int gray_data = image.at<uchar>(i, j); 用來訪問灰度圖像的單個像素。對于灰度圖像,每個像素只存儲一個值 * / if ((image.at<Vec3b>(i, j)[ 0 ] < = 120 && image.at<Vec3b>(i, j)[ 1 ] < = 120 && image.at<Vec3b>(i, j)[ 2 ] < = 120 )) { num + + ; } } } rate = ( float )num / ( float )(image.rows * image.cols); / / 閥值為 0.249255 表示為全黑 if (rate> 0.20 ) { qDebug()<< ":Mat:故意遮擋攝像頭" ; } qDebug()<< "Mat:比例" <<rate; return 0 ; } Mat Widget::QImage2cvMat(QImage image) { Mat mat; switch(image. format ()) { case QImage::Format_ARGB32: case QImage::Format_RGB32: case QImage::Format_ARGB32_Premultiplied: mat = Mat(image.height(), image.width(), CV_8UC4, (void * )image.constBits(), image.bytesPerLine()); break ; case QImage::Format_RGB888: mat = Mat(image.height(), image.width(), CV_8UC3, (void * )image.constBits(), image.bytesPerLine()); cvtColor(mat, mat, CV_BGR2RGB); break ; case QImage::Format_Indexed8: mat = Mat(image.height(), image.width(), CV_8UC1, (void * )image.constBits(), image.bytesPerLine()); break ; } return mat; } |
三、使用QImage遍歷像素點
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
/ * 在圖片里查找指定顏色的比例 * / int Widget::qimage_color_Find(QImage qimage) { int num = 0 ; / / 記錄顏色的像素點 float rate; / / 要計算的百分率 quint8 r,g,b; / / 遍歷圖片的每一個像素點 for ( int i = 0 ; i < qimage.height();i + + ) / / 行數(shù) { for ( int j = 0 ; j <qimage.width();j + + ) / / 列數(shù) { QRgb rgb = qimage.pixel(j,i); r = qRed(rgb); g = qGreen(rgb); b = qBlue(rgb); if ((r < = 120 && g < = 120 && b < = 120 )) { num + + ; } } } rate = ( float )num / ( float )(qimage.height() * qimage.width()); / / 閥值為 0.99777 表示為全黑 if (rate> 0.60 ) { / / qDebug()<< "qimage:故意遮擋攝像頭" ; } qDebug()<< "qimage:比例:" <<rate; return 0 ; } |
補充知識:判斷一批圖片中含有某中顏色物體的圖片個數(shù)占總圖片的比例
最近在做一個語義分割項目,使用Label工具進行了類別的標注.然后不同類別生成了不同的顏色,如需要代碼可以參考.后來我想統(tǒng)計一下含有一種類別的圖片和含有兩種類別的圖片占總圖片的比例,下面是我的代碼:
代碼思路:
1)循環(huán)讀取文件夾中的圖片
2)循環(huán)讀取圖片的每一個像素點,當圖片的像素點和你檢測的物體像素點一致時,對應類別加1.
3)讀取完圖片后計算每一類的比例.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
import cv2 import os import matplotlib.pyplot as plt picture_path = "/home/wsb/桌面/picture" picture_list = os.listdir(picture_path) total_picture = len (picture_list) total = total_picture per = [] number = 0 #圖片中道路類型為1的個數(shù) number1 = 0 #一種道路類型并且比例小于0.0638的個數(shù) number2 = 0 for item in picture_list: src = os.path.join(os.path.abspath(picture_path), item) print ( "start: %s " % item) total_picture - = 1 mat = cv2.imread(src) height = mat.shape[ 0 ] width = mat.shape[ 1 ] ground = 0 zero = 0 one = 0 two = 0 three = 0 four = 0 five = 0 six = 0 seven = 0 eight = 0 rateground = 0 rate0 = 0 rate1 = 0 rate2 = 0 rate3 = 0 rate4 = 0 rate5 = 0 rate6 = 0 rate7 = 0 rate8 = 0 rate = 0 road_type = 0 for i in range (height): for j in range (width): # print("r:%s"%mat[i][j][0]) # print("r:%s"%mat[i][j][1]) # print("r:%s"%mat[i][j][2]) ''' 我這里共有9種分類情況,況且我已知道每一種顏色的具體rgb值,我將它們作為我的判斷條件 如不你不知道可以在網上查找自己想查看比例的rgb值或者范圍 ''' if mat[i][j][ 0 ] = = 0 and mat[i][j][ 1 ] = = 0 and mat[i][j][ 2 ] = = 0 : ground + = 1 elif mat[i][j][ 0 ] = = 128 and mat[i][j][ 1 ] = = 0 and mat[i][j][ 2 ] = = 0 : zero + = 1 elif mat[i][j][ 0 ] = = 0 and mat[i][j][ 1 ] = = 128 and mat[i][j][ 2 ] = = 0 : one + = 1 elif mat[i][j][ 0 ] = = 128 and mat[i][j][ 1 ] = = 128 and mat[i][j][ 2 ] = = 0 : two + = 1 elif mat[i][j][ 0 ] = = 0 and mat[i][j][ 1 ] = = 0 and mat[i][j][ 2 ] = = 128 : three + = 1 elif mat[i][j][ 0 ] = = 128 and mat[i][j][ 1 ] = = 0 and mat[i][j][ 2 ] = = 128 : four + = 1 elif mat[i][j][ 0 ] = = 0 and mat[i][j][ 1 ] = = 128 and mat[i][j][ 2 ] = = 128 : five + = 1 elif mat[i][j][ 0 ] = = 128 and mat[i][j][ 1 ] = = 128 and mat[i][j][ 2 ] = = 128 : six + = 1 elif mat[i][j][ 0 ] = = 0 and mat[i][j][ 1 ] = = 0 and mat[i][j][ 2 ] = = 64 : seven + = 1 elif mat[i][j][ 0 ] = = 0 and mat[i][j][ 1 ] = = 0 and mat[i][j][ 2 ] = = 192 : eight + = 1 else : print ( "輸入正確的圖片,或者更改上面判斷條件的像素值" ) rateground = ground / (height * width) rate0 = zero / (height * width) if rate0! = 0 : road_type + = 1 rate1 = one / (height * width) if rate1! = 0 : road_type + = 1 rate2 = two / (height * width) if rate2! = 0 : road_type + = 1 rate3 = three / (height * width) if rate3! = 0 : road_type + = 1 rate4 = four / (height * width) if rate4! = 0 : road_type + = 1 rate5 = five / (height * width) if rate5! = 0 : road_type + = 1 rate6 = six / (height * width) if rate6! = 0 : road_type + = 1 rate7 = seven / (height * width) if rate7! = 0 : road_type + = 1 rate8 = eight / (height * width) if rate8! = 0 : road_type + = 1 rate = rate0 + rate1 + rate2 + rate3 + rate4 + rate5 + rate6 + rate7 + rate8 per.append(rate) if road_type = = 1 : number + = 1 if rate< 0.0638 : number1 + = 1 #一種類型道路并且所占比例小于0.0638的情況 else : if rate< 0.532 : number2 + = 1 #兩種道路類型,并且正確正確道路類型所占比例小于0.532時的個數(shù) print ( "the remaining %d" % total_picture) A = number / total #圖片中道路類型大于1種的概率 A1 = number1 / total #圖片中一種道路類型并且比例小于0.0638的概率 A2 = number2 / total #圖片中有兩種道路,并且一種道路所占比例小于0.532時的概率 print ( "A1:%s" % A1) print ( "the precentage of one road is %s" % A) print ( "the precentage of two road is %s" % ( 1 - A)) print ( "A2:%s" % A2) plt.plot(per) plt.ylabel( 'the percentage of road' ) plt.show() |
以上這篇Opencv圖像處理:如何判斷圖片里某個顏色值占的比例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/xiaolong1126626497/article/details/105594061