0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于OpenCV的路面質(zhì)量檢測

新機器視覺 ? 來源:小白學視覺 ? 2024-04-15 10:00 ? 次閱讀

本期我們將展示一種對路面類型和質(zhì)量進行分類的方法及其步驟。為了測試這種方法,我們使用了我們制作的RTK數(shù)據(jù)集。

該數(shù)據(jù)集[1]包含用低成本相機拍攝的圖像,以及新興國家常見的場景,其中包含未鋪砌的道路和坑洼。路面類型是有關(guān)人或自動駕駛車輛應如何駕駛的重要信息。除了乘客舒適度和車輛維護以外,它還涉及每個人的安全。我們可以通過[2]中的簡單卷積神經(jīng)網(wǎng)絡(CNN)結(jié)構(gòu)來實現(xiàn)。

3c31e2a8-fa67-11ee-a297-92fbcf53809c.png

在這種方法中,我們對表面類型分類任務使用特定的模型,我們將其定義為以下類別:瀝青,已鋪設(shè)(用于所有其他類型的路面)和未鋪設(shè)。對于表面質(zhì)量,我們使用其他三種不同的模型,每種類型的表面都使用一種。這四個模型都具有相同的結(jié)構(gòu)。我們從第一個模型中得出結(jié)果,并稱為特定質(zhì)量模型。

在CNN結(jié)構(gòu)之前,將感興趣區(qū)域(ROI)定義為每個輸入幀的預處理步驟。畢竟,我們不需要整個圖像來對道路進行分類。ROI旨在僅保留圖像中實際包含道路像素的部分。圖像的上半部分以及圖像底部的一小部分都將被丟棄,因為在某些幀中,它可能包含負責捕獲圖像的部分車輛。ROI采用硬編碼,因為如果我們使用自適應ROI,它可能會導致失敗并損害模型訓練。

在此預處理之后執(zhí)行數(shù)據(jù)擴充步驟。數(shù)據(jù)增強包括增加和減少每幀的亮度。這樣,我們可以改進訓練輸入集,并幫助我們的系統(tǒng)學習識別具有不同照明條件的相同類型和質(zhì)量的道路。

最后,將輸入圖像傳遞到包含三個卷積層和兩個完全連接層的CNN結(jié)構(gòu)。

3c4e52ee-fa67-11ee-a297-92fbcf53809c.png

01.RTK數(shù)據(jù)集

數(shù)據(jù)集包含具有不同類型的表面和質(zhì)量的圖像。

02.路面類型分類

我們使用了PythonTensorFlow和OpenCV。

讓我們逐步分析一下…

首先,我們需要建立表面類型分類模型。為此,您將需要準備數(shù)據(jù)以訓練模型。您可以使用RTK數(shù)據(jù)集中的圖像或制作自己的圖像。圖像需要按地面道路類型進行組織。

3c8955a6-fa67-11ee-a297-92fbcf53809c.jpg

訓練數(shù)據(jù)文件夾結(jié)構(gòu)

在我們的實驗中,我們使用了6264幀:

l鋪砌(瀝青):4344,用于柏油馬路。

l鋪砌的(混凝土的):1337用于不同的人行道,例如鵝卵石。

l未鋪砌:585用于未鋪砌,土路,越野。

接下來,在train.py中,定義從何處收集訓練數(shù)據(jù)。我們應該將20%的數(shù)據(jù)分開以自動用于驗證。我們還定義了batch_size為32。

classes = os.listdir('training_data')
num_classes = len(classes)
batch_size = 32
validation_size = 0.2
img_size = 128
num_channels = 3
train_path='training_data'

在train.py上設(shè)置的參數(shù)將在dataset.py類上讀取。

data = dataset.read_train_sets(train_path, img_size, classes, validation_size=validation_size)

在dataset.py類中,我們定義了ROI和數(shù)據(jù)擴充。帶有數(shù)據(jù)解釋功能的兩個函數(shù),Adjust_gamma可以降低亮度,而Adjust_gammaness可以提高亮度。

def adjust_gamma(image):
  gamma = 0.5
  invGamma = 1.0 / gamma
  table = np.array([((i / 255.0) ** invGamma) * 255 
    for i in np.arange(0, 256)]).astype("uint8")
  return cv2.LUT(image, table)
def increase_brightness(img, value):
  hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
  h, s, v = cv2.split(hsv)
  lim = 255 - value
  v[v > lim] = 255
  v[v <= lim] += value
  final_hsv = cv2.merge((h, s, v))
  img = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2BGR)
  return img

加載輸入數(shù)據(jù)時,將為每個圖像定義ROI。

for fields in classes:
  index = classes.index(fields)
  print('Now going to read {} files (Index: {})'.format(fields, index))
  path = os.path.join(train_path, fields, '*g')
  files = glob.glob(path)
  for fl in files:
    image = cv2.imread(fl)
    # Region Of Interest (ROI)
    height, width = image.shape[:2]
    newHeight = int(round(height/2))
    image = image[newHeight-5:height-50, 0:width]
    brght_img = increase_brightness(image, value=150)
    shaded_img = adjust_gamma(image)
    image = cv2.resize(image, (image_size, image_size),0,0, cv2.INTER_LINEAR)
    image = image.astype(np.float32)
    image = np.multiply(image, 1.0 / 255.0)
    brght_img = cv2.resize(brght_img, (image_size, image_size),0,0, cv2.INTER_LINEAR)
    brght_img = brght_img.astype(np.float32)
    brght_img = np.multiply(brght_img, 1.0 / 255.0)
    shaded_img = cv2.resize(shaded_img, (image_size, image_size),0,0, cv2.INTER_LINEAR)
    shaded_img = shaded_img.astype(np.float32)
    shaded_img = np.multiply(brght_img, 1.0 / 255.0)

我們還會平衡輸入圖像,因為瀝青的圖像更多,而未鋪砌和未鋪砌的道路更少。

if index == 0: #asphalt
  images.append(image)
  images.append(brght_img)
  images.append(shaded_img)
elif index == 1: #paved
  for i in range(3):
    images.append(image)
    images.append(brght_img)
    images.append(shaded_img)
elif index == 2: #unpaved
  for i in range(6):
    images.append(image)
    images.append(brght_img)
    images.append(shaded_img)

回到train.py,讓我們定義TensorFlow教程[2]中所示的CNN層。所有選擇到訓練步驟的圖像都將傳遞到第一卷積層,其中包含有關(guān)通道的寬度,高度和數(shù)量的信息。前兩層包含32個大小為3x3的濾鏡。緊接著是一個具有3x3大小的64個濾鏡的圖層。所有的步幅都定義為1,填充的定義為0。正態(tài)分布用于權(quán)重初始化。為了在尺寸上減少輸入,這有助于分析輸入子區(qū)域中的特征信息,在所有卷積層中應用了最大池。在每個卷積層的末尾,在最大合并功能之后,將ReLU用作激活功能。

def create_convolutional_layer(input,
               num_input_channels, 
               conv_filter_size,        
               num_filters):
  weights = create_weights(shape=[conv_filter_size, conv_filter_size, num_input_channels, num_filters])
  biases = create_biases(num_filters)
  layer = tf.nn.conv2d(input=input,
                     filter=weights,
                     strides=[1, 1, 1, 1],
                     padding='SAME')
  layer += biases
  layer = tf.nn.max_pool(value=layer,
                            ksize=[1, 2, 2, 1],
                            strides=[1, 2, 2, 1],
                            padding='SAME')
  layer = tf.nn.relu(layer)

在卷積層之后,平坦層用于將卷積多維張量轉(zhuǎn)換為一維張量。

def create_flatten_layer(layer):
    layer_shape = layer.get_shape()
    num_features = layer_shape[1:4].num_elements()
    layer = tf.reshape(layer, [-1, num_features])
    return layer

最后添加兩個完全連接的層。在第一個完全連接的層中,應用了ReLU激活功能。第二個完全連接的層具有可能的輸出,所需的類別。

def create_fc_layer(input,          
             num_inputs,    
             num_outputs,
             use_relu=True):
  weights = create_weights(shape=[num_inputs, num_outputs])
  biases = create_biases(num_outputs)
  layer = tf.matmul(input, weights) + biases
  if use_relu:
    layer = tf.nn.relu(layer)
  return layer

我們使用softmax函數(shù)來實現(xiàn)每個類的概率。最后,我們還使用Adam優(yōu)化器,該優(yōu)化器根據(jù)訓練中使用的輸入數(shù)據(jù)更新網(wǎng)絡權(quán)重。

layer_conv1 = create_convolutional_layer(input=x,
               num_input_channels=num_channels,
               conv_filter_size=filter_size_conv1,
               num_filters=num_filters_conv1)
layer_conv2 = create_convolutional_layer(input=layer_conv1,
               num_input_channels=num_filters_conv1,
               conv_filter_size=filter_size_conv2,
               num_filters=num_filters_conv2)
layer_conv3= create_convolutional_layer(input=layer_conv2,
               num_input_channels=num_filters_conv2,
               conv_filter_size=filter_size_conv3,
               num_filters=num_filters_conv3)
layer_flat = create_flatten_layer(layer_conv3)
layer_fc1 = create_fc_layer(input=layer_flat,
                     num_inputs=layer_flat.get_shape()[1:4].num_elements(),
                     num_outputs=fc_layer_size,
                     use_relu=True)
layer_fc2 = create_fc_layer(input=layer_fc1,
                     num_inputs=fc_layer_size,
                     num_outputs=num_classes,
                     use_relu=False) 
y_pred = tf.nn.softmax(layer_fc2,name='y_pred')
y_pred_cls = tf.argmax(y_pred, dimension=1)
session.run(tf.global_variables_initializer())
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=layer_fc2,
                                                    labels=y_true)
cost = tf.reduce_mean(cross_entropy)
optimizer = tf.train.AdamOptimizer(learning_rate=1e-4).minimize(cost)
correct_prediction = tf.equal(y_pred_cls, y_true_cls)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

可以python train.py在終端中訓練模型的運行:

現(xiàn)在,有了經(jīng)過訓練的模型,我們就可以測試。首先,讓我們準備好接收輸入測試幀和輸出文件名。

outputFile = sys.argv[2]
# Opening frames
cap = cv.VideoCapture(sys.argv[1])
vid_writer = cv.VideoWriter(outputFile, cv.VideoWriter_fourcc('M','J','P','G'), 15, (round(cap.get(cv.CAP_PROP_FRAME_WIDTH)),round(cap.get(cv.CAP_PROP_FRAME_HEIGHT))))

檢索訓練好的模型并訪問圖形。

sess = tf.Session()
saver = tf.train.import_meta_graph('roadsurface-model.meta')
saver.restore(sess, tf.train.latest_checkpoint('./'))
graph = tf.get_default_graph()
y_pred = graph.get_tensor_by_name("y_pred:0")
x = graph.get_tensor_by_name("x:0")
y_true = graph.get_tensor_by_name("y_true:0")
y_test_images = np.zeros((1, len(os.listdir('training_data'))))

請記住,我們不需要整個圖像,我們的培訓著重于使用ROI,在這里我們也使用它。

width = int(round(cap.get(cv.CAP_PROP_FRAME_WIDTH)))
height = int(round(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))
newHeight = int(round(height/2))
while cv.waitKey(1) < 0:
    hasFrame, images = cap.read()
    finalimg = images
    images = images[newHeight-5:height-50, 0:width]
    images = cv.resize(images, (image_size, image_size), 0, 0, cv.INTER_LINEAR)
    images = np.array(images, dtype=np.uint8)
    images = images.astype('float32')
    images = np.multiply(images, 1.0/255.0)

最后,基于輸出預測,我們可以在每幀中打印分類的表面類型。

x_batch = images.reshape(1, image_size, image_size, num_channels)
feed_dict_testing = {x: x_batch, y_true: y_test_images}
result = sess.run(y_pred, feed_dict=feed_dict_testing)
outputs = [result[0,0], result[0,1], result[0,2]]
value = max(outputs)
index = np.argmax(outputs)
if index == 0:
  label = 'Asphalt'
  prob = str("{0:.2f}".format(value))
  color = (0, 0, 0)
elif index == 1:
  label = 'Paved'
  prob = str("{0:.2f}".format(value))
  color = (153, 102, 102)
elif index == 2:
  label = 'Unpaved'
  prob = str("{0:.2f}".format(value))
  color = (0, 153, 255)
cv.rectangle(finalimg, (0, 0), (145, 40), (255, 255, 255), cv.FILLED)
cv.putText(finalimg, 'Class: ', (5,15), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1)
cv.putText(finalimg, label, (70,15), cv.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)
cv.putText(finalimg, prob, (5,35), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1)
vid_writer.write(finalimg.astype(np.uint8))

可以測試在終端中運行的模型:python test.py PATH_TO_YOUR_FRAMES_SEQUENCE NAME_YOUR_VIDEO_FILE.avi。

03.路面質(zhì)量分類

現(xiàn)在讓我們包括質(zhì)量分類。我們僅使用用于訓練表面類型分類模型的相同CNN架構(gòu),并分別在每個表面類別上應用每個質(zhì)量類別。因此,除了現(xiàn)有模型外,我們還培訓了3種新模型。為此,大家將需要準備用于訓練每個表面類別的模型的數(shù)據(jù)。在RTK數(shù)據(jù)集頁面中,我們已經(jīng)給出了按班級組織的框架。

3c904fd2-fa67-11ee-a297-92fbcf53809c.jpg

用于質(zhì)量課程的培訓數(shù)據(jù)文件夾結(jié)構(gòu)

要訓練每種模型,小伙伴們可以在終端中運行:

python trainAsphaltQuality.py 
python trainPavedQuality.py 
python trainUnpavedQuality.py

現(xiàn)在,預測部分發(fā)生了什么變化。我們使用四個不同的圖,每個訓練模型一個。

graph = tf.Graph()
graphAQ = tf.Graph()
graphPQ = tf.Graph()
graphUQ = tf.Graph()

04.模型恢復

恢復類型模型

with graph.as_default():
    saver = tf.train.import_meta_graph('roadsurfaceType-model.meta')
    y_pred = graph.get_tensor_by_name("y_pred:0")
    x = graph.get_tensor_by_name("x:0")
    y_true = graph.get_tensor_by_name("y_true:0")
    y_test_images = np.zeros((1, len(os.listdir('training_data_type'))))
sess = tf.Session(graph = graph)
saver.restore(sess, tf.train.latest_checkpoint('typeCheckpoint/'))

恢復瀝青質(zhì)量模型

with graphAQ.as_default():
    saverAQ = tf.train.import_meta_graph('roadsurfaceAsphaltQuality-model.meta')
    y_predAQ = graphAQ.get_tensor_by_name("y_pred:0")
    xAQ = graphAQ.get_tensor_by_name("x:0")
    y_trueAQ = graphAQ.get_tensor_by_name("y_true:0")
    y_test_imagesAQ = np.zeros((1, len(os.listdir('training_data_asphalt_quality'))))
sessAQ = tf.Session(graph = graphAQ)
saverAQ.restore(sessAQ, tf.train.latest_checkpoint('asphaltCheckpoint/'))

恢復鋪砌的質(zhì)量模型

with graphPQ.as_default():
    saverPQ = tf.train.import_meta_graph('roadsurfacePavedQuality-model.meta')
    y_predPQ = graphPQ.get_tensor_by_name("y_pred:0")
    xPQ = graphPQ.get_tensor_by_name("x:0")
    y_truePQ = graphPQ.get_tensor_by_name("y_true:0")
    y_test_imagesPQ = np.zeros((1, len(os.listdir('training_data_paved_quality'))))
sessPQ = tf.Session(graph = graphPQ)
saverPQ.restore(sessPQ, tf.train.latest_checkpoint('pavedCheckpoint/'))

恢復未鋪砌的質(zhì)量模型

with graphUQ.as_default():
    saverUQ = tf.train.import_meta_graph('roadsurfaceUnpavedQuality-model.meta')
    y_predUQ = graphUQ.get_tensor_by_name("y_pred:0")
    xUQ = graphUQ.get_tensor_by_name("x:0")
    y_trueUQ = graphUQ.get_tensor_by_name("y_true:0")
    y_test_imagesUQ = np.zeros((1, len(os.listdir('training_data_unpaved_quality'))))
sessUQ = tf.Session(graph = graphUQ)
saverUQ.restore(sessUQ, tf.train.latest_checkpoint('unpavedCheckpoint/'))

此時,輸出預測也要考慮質(zhì)量模型,我們可以在每個幀中打印分類的表面類型以及該表面的質(zhì)量。

if index == 0: #Asphalt
        label = 'Asphalt'
        prob = str("{0:.2f}".format(value))
        color = (0, 0, 0)
        x_batchAQ = images.reshape(1, image_size, image_size, num_channels)
        feed_dict_testingAQ = {xAQ: x_batchAQ, y_trueAQ: y_test_imagesAQ}
        resultAQ = sessAQ.run(y_predAQ, feed_dict=feed_dict_testingAQ)
        outputsQ = [resultAQ[0,0], resultAQ[0,1], resultAQ[0,2]]
        valueQ = max(outputsQ)
        indexQ = np.argmax(outputsQ)
        if indexQ == 0: #Asphalt - Good
            quality = 'Good'
            colorQ = (0, 255, 0)
            probQ =  str("{0:.2f}".format(valueQ))
        elif indexQ == 1: #Asphalt - Regular
            quality = 'Regular'
            colorQ = (0, 204, 255)
            probQ =  str("{0:.2f}".format(valueQ))
        elif indexQ == 2: #Asphalt - Bad
            quality = 'Bad'
            colorQ = (0, 0, 255)
            probQ =  str("{0:.2f}".format(valueQ))  
    elif index == 1: #Paved
        label = 'Paved'
        prob = str("{0:.2f}".format(value))
        color = (153, 102, 102)
        x_batchPQ = images.reshape(1, image_size, image_size, num_channels)
        feed_dict_testingPQ = {xPQ: x_batchPQ, y_truePQ: y_test_imagesPQ}
        resultPQ = sessPQ.run(y_predPQ, feed_dict=feed_dict_testingPQ)
        outputsQ = [resultPQ[0,0], resultPQ[0,1], resultPQ[0,2]]
        valueQ = max(outputsQ)
        indexQ = np.argmax(outputsQ)
        if indexQ == 0: #Paved - Good
            quality = 'Good'
            colorQ = (0, 255, 0)
            probQ =  str("{0:.2f}".format(valueQ))
        elif indexQ == 1: #Paved - Regular
            quality = 'Regular'
            colorQ = (0, 204, 255)
            probQ =  str("{0:.2f}".format(valueQ))
        elif indexQ == 2: #Paved - Bad
            quality = 'Bad'
            colorQ = (0, 0, 255)
            probQ =  str("{0:.2f}".format(valueQ))
    elif index == 2: #Unpaved
        label = 'Unpaved'
        prob = str("{0:.2f}".format(value))
        color = (0, 153, 255)
        x_batchUQ = images.reshape(1, image_size, image_size, num_channels)
        feed_dict_testingUQ = {xUQ: x_batchUQ, y_trueUQ: y_test_imagesUQ}
        resultUQ = sessUQ.run(y_predUQ, feed_dict=feed_dict_testingUQ)
        outputsQ = [resultUQ[0,0], resultUQ[0,1]]
        valueQ = max(outputsQ)
        indexQ = np.argmax(outputsQ)
        if indexQ == 0: #Unpaved - Regular
            quality = 'Regular'
            colorQ = (0, 204, 255)
            probQ =  str("{0:.2f}".format(valueQ))
        elif indexQ == 1: #Unpaved - Bad
            quality = 'Bad'
            colorQ = (0, 0, 255)
            probQ =  str("{0:.2f}".format(valueQ))

打印結(jié)果

cv.rectangle(finalimg, (0, 0), (145, 80), (255, 255, 255), cv.FILLED)
cv.putText(finalimg, 'Class: ', (5,15), cv.FONT_HERSHEY_DUPLEX, 0.5, (0,0,0))
cv.putText(finalimg, label, (70,15), cv.FONT_HERSHEY_DUPLEX, 0.5, color)
cv.putText(finalimg, prob, (5,35), cv.FONT_HERSHEY_DUPLEX, 0.5, (0,0,0))
cv.putText(finalimg, 'Quality: ', (5,55), cv.FONT_HERSHEY_DUPLEX, 0.5, (0,0,0))
cv.putText(finalimg, quality, (70,55), cv.FONT_HERSHEY_DUPLEX, 0.5, colorQ)
cv.putText(finalimg, probQ, (5,75), cv.FONT_HERSHEY_DUPLEX, 0.5, (0,0,0))

大家可以在終端中測試運行情況:python testRTK.py PATH_TO_YOUR_FRAMES_SEQUENCE NAME_YOUR_VIDEO_FILE.avi。

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    622

    瀏覽量

    41091
  • cnn
    cnn
    +關(guān)注

    關(guān)注

    3

    文章

    349

    瀏覽量

    21968

原文標題:基于OpenCV的路面質(zhì)量檢測

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何在OpenCV中使用基于深度學習的邊緣檢測

    在這篇文章中,我們將學習如何在OpenCV中使用基于深度學習的邊緣檢測,它比目前流行的canny邊緣檢測器更精確。
    的頭像 發(fā)表于 05-19 09:52 ?1926次閱讀
    如何在<b class='flag-5'>OpenCV</b>中使用基于深度學習的邊緣<b class='flag-5'>檢測</b>?

    基于openCV的人臉檢測系統(tǒng)的設(shè)計

    通過對基于Adaboost人臉檢測算法的研究,利用該算法與計算機視覺類庫openCV進行人臉檢測系統(tǒng)的設(shè)計,實現(xiàn)了對出現(xiàn)在視頻或圖像中的人臉檢測。此外,在VC++6.0環(huán)境下實現(xiàn)了對一
    發(fā)表于 12-23 14:19

    如何使用Python中的OpenCV模塊檢測顏色

    在這篇文章中,我們將看到如何使用 Python 中的 OpenCV 模塊檢測顏色,進入這個領(lǐng)域的第一步就是安裝下面提到的模塊。pip install opencv-pythonpip install
    發(fā)表于 02-09 16:31

    openCV邊緣檢測原理是什么?

    openCV是通過什么原理來實現(xiàn)邊緣檢測
    發(fā)表于 10-10 06:21

    Android系統(tǒng)下OpenCV的人臉檢測模塊的設(shè)計

    針對解決OpenCV人臉檢測模塊在Android平臺編譯和移植的問題,提出一種利用JNI技術(shù)(Java Native Interface)調(diào)用OpenCV以及采用Android NDK(Native Development Ki
    發(fā)表于 11-07 17:40 ?118次下載
    Android系統(tǒng)下<b class='flag-5'>OpenCV</b>的人臉<b class='flag-5'>檢測</b>模塊的設(shè)計

    基于特征提取的快速掃描方法實現(xiàn)路面破損實時檢測系統(tǒng)的設(shè)計

    高等級公路建設(shè)快速發(fā)展,路面質(zhì)量監(jiān)控體系完善,則要求高的檢測水平。
    發(fā)表于 08-13 15:15 ?725次閱讀
    基于特征提取的快速掃描方法實現(xiàn)<b class='flag-5'>路面</b>破損實時<b class='flag-5'>檢測</b>系統(tǒng)的設(shè)計

    OpenCV使用深度學習做邊緣檢測的流程

    導讀 分析了Canny的優(yōu)劣,并給出了OpenCV使用深度學習做邊緣檢測的流程。 在這篇文章中,我們將學習如何在OpenCV中使用基于深度學習的邊緣檢測,它比目前流行的canny邊緣
    的頭像 發(fā)表于 05-08 11:05 ?2171次閱讀
    <b class='flag-5'>OpenCV</b>使用深度學習做邊緣<b class='flag-5'>檢測</b>的流程

    如何使用Python OpenCV進行面部標志檢測

    今天我們將使用相同的 OpenCV 和 Raspberry Pi 進行人臉標志檢測。來自 dlib 庫的預訓練面部標志檢測器模塊將用于檢測面部關(guān)鍵面部結(jié)構(gòu)的位置,python
    發(fā)表于 08-12 16:32 ?1360次閱讀
    如何使用Python <b class='flag-5'>OpenCV</b>進行面部標志<b class='flag-5'>檢測</b>

    OpenCV編程:OpenCV3.X訓練自己的分類器

    OpenCV的官方已經(jīng)提供了很多訓練好的分類器文件,在OpenCV的安裝目錄下有,文件中提供了常見的 人臉檢測、眼睛檢測、貓臉檢測、行人
    的頭像 發(fā)表于 08-14 09:31 ?1768次閱讀
    <b class='flag-5'>OpenCV</b>編程:<b class='flag-5'>OpenCV</b>3.X訓練自己的分類器

    OpenCV中支持的非分類與檢測視覺模型

    前面給大家分別匯總了OpenCV中支持的圖像分類與對象檢測模型,視覺視覺任務除了分類與檢測還有很多其他任務,這里我們就來OpenCV中支持的非分類與
    的頭像 發(fā)表于 08-19 09:10 ?1147次閱讀

    使用opencv和python進行智能火災檢測

    電子發(fā)燒友網(wǎng)站提供《使用opencv和python進行智能火災檢測.zip》資料免費下載
    發(fā)表于 11-02 15:08 ?0次下載
    使用<b class='flag-5'>opencv</b>和python進行智能火災<b class='flag-5'>檢測</b>

    OpenCV FFT模糊檢測方法

    ? 在本教程中,您將學習如何使用OpenCV和快速傅里葉變換(FFT)在圖像和實時視流中執(zhí)行模糊檢測。 今天的教程是我上一篇關(guān)于OpenCV模糊檢測的博客文章的擴展 原始模糊
    的頭像 發(fā)表于 06-26 10:47 ?803次閱讀
    <b class='flag-5'>OpenCV</b> FFT模糊<b class='flag-5'>檢測</b>方法

    路面壓實度實時監(jiān)測系統(tǒng)與傳統(tǒng)檢測方法分析

    路基路面壓實度質(zhì)量是道路工程施工質(zhì)量管理重要的內(nèi)在指標之一,只有對路基、路面結(jié)構(gòu)層進行充分壓實,才能保證路基、路面的強度。剛度及
    的頭像 發(fā)表于 07-18 17:50 ?356次閱讀
    <b class='flag-5'>路面</b>壓實度實時監(jiān)測系統(tǒng)與傳統(tǒng)<b class='flag-5'>檢測</b>方法分析

    路面攤鋪壓實施工質(zhì)量管理系統(tǒng)推進路面智慧工地監(jiān)測

    實過程的實時動態(tài)監(jiān)測。 路面攤鋪壓實施工質(zhì)量管理系統(tǒng)建立了路面施工過程中重點數(shù)據(jù)的質(zhì)量數(shù)據(jù)庫,實現(xiàn)了由低效率的事后質(zhì)量
    的頭像 發(fā)表于 03-07 18:26 ?752次閱讀
    <b class='flag-5'>路面</b>攤鋪壓實施工<b class='flag-5'>質(zhì)量</b>管理系統(tǒng)推進<b class='flag-5'>路面</b>智慧工地監(jiān)測

    基于機器視覺的公路路面檢測

    當前,公路病害檢測主要依靠的單相機檢測方案,不僅檢測效率和精確度低,而且在一些特殊情況下,如遇到裂縫平行于路面方向,高吸光率材質(zhì)或者其他特殊材質(zhì)的
    的頭像 發(fā)表于 03-28 11:46 ?223次閱讀
    基于機器視覺的公路<b class='flag-5'>路面</b><b class='flag-5'>檢測</b>