在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

如何基于計(jì)算機(jī)視覺實(shí)現(xiàn)道路交通計(jì)數(shù)

新機(jī)器視覺 ? 來源:新機(jī)器視覺 ? 2023-06-12 09:43 ? 次閱讀

今天,我們將一起探討如何基于計(jì)算機(jī)視覺實(shí)現(xiàn)道路交通計(jì)數(shù)。

在本教程中,我們將僅使用Python和OpenCV,并借助背景減除算法非常簡(jiǎn)單地進(jìn)行運(yùn)動(dòng)檢測(cè)。

我們將從以下四個(gè)方面進(jìn)行介紹:

1. 用于物體檢測(cè)的背景減法算法主要思想。

2. OpenCV圖像過濾器。

3. 利用輪廓檢測(cè)物體。

4. 建立進(jìn)一步數(shù)據(jù)處理的結(jié)構(gòu)。

背景扣除算法

cab6df4a-08b1-11ee-962d-dac502259ad0.png

有許多不同的背景扣除算法,但是它們的主要思想都很簡(jiǎn)單。

假設(shè)有一個(gè)房間的視頻,在某些幀上沒有人和寵物,那么此時(shí)的視頻基本為靜態(tài)的,我們將其稱為背景(background_layer)。因此要獲取在視頻上移動(dòng)的對(duì)象,我們只需要:用當(dāng)前幀減去背景即可。

由于光照變化,人為移動(dòng)物體,或者始終存在移動(dòng)的人和寵物,我們將無法獲得靜態(tài)幀。在這種情況下,我們從視頻中選出一些圖像幀,如果絕大多數(shù)圖像幀中都具有某個(gè)相同的像素點(diǎn),則此將像素作為background_layer中的一部分。

我們將使用MOG算法進(jìn)行背景扣除

cacad81a-08b1-11ee-962d-dac502259ad0.png

原始幀

代碼如下所示:

import os
import logging
import logging.handlers
import random


import numpy as np
import skvideo.io
import cv2
import matplotlib.pyplot as plt


import utils
# without this some strange errors happen
cv2.ocl.setUseOpenCL(False)
random.seed(123)


# ============================================================================
IMAGE_DIR = "./out"
VIDEO_SOURCE = "input.mp4"
SHAPE = (720, 1280)  # HxW
# ============================================================================


def train_bg_subtractor(inst, cap, num=500):
'''
        BG substractor need process some amount of frames to start giving result
    '''
print ('Training BG Subtractor...')
    i = 0
for frame in cap:
        inst.apply(frame, None, 0.001)
        i += 1
if i >= num:
return cap


def main():
    log = logging.getLogger("main")


# creting MOG bg subtractor with 500 frames in cache
# and shadow detction
    bg_subtractor = cv2.createBackgroundSubtractorMOG2(
        history=500, detectShadows=True)


# Set up image source
# You can use also CV2, for some reason it not working for me
    cap = skvideo.io.vreader(VIDEO_SOURCE)


# skipping 500 frames to train bg subtractor
    train_bg_subtractor(bg_subtractor, cap, num=500)


    frame_number = -1
for frame in cap:
if not frame.any():
            log.error("Frame capture failed, stopping...")
break


        frame_number += 1
        utils.save_frame(frame, "./out/frame_%04d.png" % frame_number)
        fg_mask = bg_subtractor.apply(frame, None, 0.001)
        utils.save_frame(frame, "./out/fg_mask_%04d.png" % frame_number)
# ============================================================================


if __name__ == "__main__":
    log = utils.init_logging()


if not os.path.exists(IMAGE_DIR):
        log.debug("Creating image directory `%s`...", IMAGE_DIR)
        os.makedirs(IMAGE_DIR)


    main()

處理后得到下面的前景圖像

cae5a186-08b1-11ee-962d-dac502259ad0.png

去除背景后的前景圖像

我們可以看出前景圖像上有一些噪音,可以通過標(biāo)準(zhǔn)濾波技術(shù)可以將其消除。

濾波

針對(duì)我們現(xiàn)在的情況,我們將需要以下濾波函數(shù):Threshold、Erode、Dilate、Opening、Closing。

首先,我們使用“Closing”來移除區(qū)域中的間隙,然后使用“Opening”來移除個(gè)別獨(dú)立的像素點(diǎn),然后使用“Dilate”進(jìn)行擴(kuò)張以使對(duì)象變粗。代碼如下:

def filter_mask(img):
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2))
    # Fill any small holes
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
    # Remove noise
opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel)
    # Dilate to merge adjacent blobs
dilation = cv2.dilate(opening, kernel, iterations=2)
    # threshold
th = dilation[dilation < 240] = 0
return th

處理后的前景如下:

cb054090-08b1-11ee-962d-dac502259ad0.png

利用輪廓進(jìn)行物體檢測(cè)

我們將使用cv2.findContours函數(shù)對(duì)輪廓進(jìn)行檢測(cè)。我們?cè)谑褂玫臅r(shí)候可以選擇的參數(shù)為:

cv2.CV_RETR_EXTERNAL------僅獲取外部輪廓。

cv2.CV_CHAIN_APPROX_TC89_L1------使用Teh-Chin鏈逼近算法(更快)

代碼如下:

def get_centroid(x, y, w, h):
x1 = int(w / 2)
y1 = int(h / 2)
cx = x + x1
cy = y + y1
return (cx, cy)


def detect_vehicles(fg_mask, min_contour_width=35, min_contour_height=35):
matches = []
      # finding external contours
im, contours, hierarchy = cv2.findContours(
fg_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1)
      # filtering by with, height
for (i, contour) in enumerate(contours):
(x, y, w, h) = cv2.boundingRect(contour)
contour_valid = (w >= min_contour_width) and (
h >= min_contour_height)
if not contour_valid:
continue
          # getting center of the bounding box
centroid = get_centroid(x, y, w, h)
matches.append(((x, y, w, h), centroid))
return matches

建立數(shù)據(jù)處理框架

我們都知道在ML和CV中,沒有一個(gè)算法可以處理所有問題。即使存在這種算法,我們也不會(huì)使用它,因?yàn)樗茈y大規(guī)模有效。例如幾年前Netflix公司用300萬美元的獎(jiǎng)金懸賞最佳電影推薦算法。有一個(gè)團(tuán)隊(duì)完成這個(gè)任務(wù),但是他們的推薦算法無法大規(guī)模運(yùn)行,因此其實(shí)對(duì)公司毫無用處。但是,Netflix公司仍獎(jiǎng)勵(lì)了他們100萬美元。

接下來我們來建立解決當(dāng)前問題的框架,這樣可以使數(shù)據(jù)的處理更加方便

class PipelineRunner(object):
'''
          Very simple pipline.
          Just run passed processors in order with passing context from one to 
          another.
          You can also set log level for processors.
      '''
def __init__(self, pipeline=None, log_level=logging.DEBUG):
self.pipeline = pipeline or []
self.context = {}
self.log = logging.getLogger(self.__class__.__name__)
self.log.setLevel(log_level)
self.log_level = log_level
self.set_log_level()
def set_context(self, data):
self.context = data
def add(self, processor):
if not isinstance(processor, PipelineProcessor):
              raise Exception(
'Processor should be an isinstance of PipelineProcessor.')
          processor.log.setLevel(self.log_level)
self.pipeline.append(processor)


def remove(self, name):
for i, p in enumerate(self.pipeline):
if p.__class__.__name__ == name:
                  del self.pipeline[i]
return True
return False


def set_log_level(self):
for p in self.pipeline:
              p.log.setLevel(self.log_level)


def run(self):
for p in self.pipeline:
self.context = p(self.context) 
self.log.debug("Frame #%d processed.", self.context['frame_number'])
return self.context


class PipelineProcessor(object):
'''
          Base class for processors.
      '''
def __init__(self):
self.log = logging.getLogger(self.__class__.__name__)

首先我們獲取一張處理器運(yùn)行順序的列表,讓每個(gè)處理器完成一部分工作,在案順序完成執(zhí)行以獲得最終結(jié)果。

我們首先創(chuàng)建輪廓檢測(cè)處理器。輪廓檢測(cè)處理器只需將前面的背景扣除,濾波和輪廓檢測(cè)部分合并在一起即可,代碼如下所示:

class ContourDetection(PipelineProcessor):
'''
          Detecting moving objects.
          Purpose of this processor is to subtrac background, get moving objects
          and detect them with a cv2.findContours method, and then filter off-by
          width and height. 
          bg_subtractor - background subtractor isinstance.
          min_contour_width - min bounding rectangle width.
          min_contour_height - min bounding rectangle height.
          save_image - if True will save detected objects mask to file.
          image_dir - where to save images(must exist).        
      '''


def __init__(self, bg_subtractor, min_contour_width=35, min_contour_height=35, save_image=False, image_dir='images'):
          super(ContourDetection, self).__init__()
          self.bg_subtractor = bg_subtractor
          self.min_contour_width = min_contour_width
          self.min_contour_height = min_contour_height
          self.save_image = save_image
          self.image_dir = image_dir


def filter_mask(self, img, a=None):
'''
              This filters are hand-picked just based on visual tests
          '''
          kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (2, 2))
# Fill any small holes
          closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# Remove noise
          opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel)
# Dilate to merge adjacent blobs
          dilation = cv2.dilate(opening, kernel, iterations=2)
return dilation


def detect_vehicles(self, fg_mask, context):
          matches = []
# finding external contours
          im2, contours, hierarchy = cv2.findContours(
              fg_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_TC89_L1)
for (i, contour) in enumerate(contours):
              (x, y, w, h) = cv2.boundingRect(contour)
              contour_valid = (w >= self.min_contour_width) and (
                  h >= self.min_contour_height)
if not contour_valid:
continue
              centroid = utils.get_centroid(x, y, w, h)
              matches.append(((x, y, w, h), centroid))
return matches


def __call__(self, context):
          frame = context['frame'].copy()
          frame_number = context['frame_number']
          fg_mask = self.bg_subtractor.apply(frame, None, 0.001)
# just thresholding values
          fg_mask[fg_mask < 240] = 0
          fg_mask = self.filter_mask(fg_mask, frame_number)
if self.save_image:
              utils.save_frame(fg_mask, self.image_dir +
"/mask_%04d.png" % frame_number, flip=False)
          context['objects'] = self.detect_vehicles(fg_mask, context)
          context['fg_mask'] = fg_mask
return contex

現(xiàn)在,讓我們創(chuàng)建一個(gè)處理器,該處理器將找出不同的幀上檢測(cè)到的相同對(duì)象,創(chuàng)建路徑,并對(duì)到達(dá)出口區(qū)域的車輛進(jìn)行計(jì)數(shù)。代碼如下所示:

'''
        Counting vehicles that entered in exit zone.


        Purpose of this class based on detected object and local cache create
        objects pathes and count that entered in exit zone defined by exit masks.


        exit_masks - list of the exit masks.
        path_size - max number of points in a path.
        max_dst - max distance between two points.
    '''


def __init__(self, exit_masks=[], path_size=10, max_dst=30, x_weight=1.0, y_weight=1.0):
super(VehicleCounter, self).__init__()


self.exit_masks = exit_masks


self.vehicle_count = 0
self.path_size = path_size
self.pathes = []
self.max_dst = max_dst
self.x_weight = x_weight
self.y_weight = y_weight


def check_exit(self, point):
for exit_mask in self.exit_masks:
try:
if exit_mask[point[1]][point[0]] == 255:
return True
except:
return True
return False


def __call__(self, context):
        objects = context['objects']
        context['exit_masks'] = self.exit_masks
        context['pathes'] = self.pathes
        context['vehicle_count'] = self.vehicle_count
if not objects:
return context


        points = np.array(objects)[:, 0:2]
        points = points.tolist()


# add new points if pathes is empty
if not self.pathes:
for match in points:
self.pathes.append([match])


else:
# link new points with old pathes based on minimum distance between
# points
            new_pathes = []


for path in self.pathes:
                _min = 999999
                _match = None
for p in points:
if len(path) == 1:
# distance from last point to current
                        d = utils.distance(p[0], path[-1][0])
else:
# based on 2 prev points predict next point and calculate
# distance from predicted next point to current
                        xn = 2 * path[-1][0][0] - path[-2][0][0]
                        yn = 2 * path[-1][0][1] - path[-2][0][1]
                        d = utils.distance(
                            p[0], (xn, yn),
                            x_weight=self.x_weight,
                            y_weight=self.y_weight
                        )


if d < _min:
                        _min = d
                        _match = p


if _match and _min <= self.max_dst:
                    points.remove(_match)
                    path.append(_match)
                    new_pathes.append(path)


# do not drop path if current frame has no matches
if _match is None:
                    new_pathes.append(path)


self.pathes = new_pathes


# add new pathes
if len(points):
for p in points:
# do not add points that already should be counted
if self.check_exit(p[1]):
                        continue
self.pathes.append([p])


# save only last N points in path
for i, _ in enumerate(self.pathes):
self.pathes[i] = self.pathes[i][self.path_size * -1:]


# count vehicles and drop counted pathes:
        new_pathes = []
for i, path in enumerate(self.pathes):
            d = path[-2:]


if (
# need at list two points to count
                len(d) >= 2 and
# prev point not in exit zone
not self.check_exit(d[0][1]) and
# current point in exit zone
self.check_exit(d[1][1]) and
# path len is bigger then min
self.path_size <= len(path)
            ):
self.vehicle_count += 1
else:
# prevent linking with path that already in exit zone
                add = True
for p in path:
if self.check_exit(p[1]):
                        add = False
break
if add:
                    new_pathes.append(path)


self.pathes = new_pathes


        context['pathes'] = self.pathes
        context['objects'] = objects
        context['vehicle_count'] = self.vehicle_count


self.log.debug('#VEHICLES FOUND: %s' % self.vehicle_count)


return context

上面的代碼有點(diǎn)復(fù)雜,因此讓我們一個(gè)部分一個(gè)部分的介紹一下。

cb1d7ee4-08b1-11ee-962d-dac502259ad0.jpg

上面的圖像中綠色的部分是出口區(qū)域。我們?cè)谶@里對(duì)車輛進(jìn)行計(jì)數(shù),只有當(dāng)車輛移動(dòng)的長(zhǎng)度超過3個(gè)點(diǎn)我們才進(jìn)行計(jì)算

我們使用掩碼來解決這個(gè)問題,因?yàn)樗仁褂檬噶克惴ㄓ行液?jiǎn)單得多。只需使用“二進(jìn)制和”即可選出車輛區(qū)域中點(diǎn)。設(shè)置方式如下:

EXIT_PTS = np.array([
      [[732, 720], [732, 590], [1280, 500], [1280, 720]],
      [[0, 400], [645, 400], [645, 0], [0, 0]]
  ])


base = np.zeros(SHAPE + (3,), dtype='uint8')
  exit_mask = cv2.fillPoly(base, EXIT_PTS, (255, 255, 255))[:, :, 0]    

現(xiàn)在我們將檢測(cè)到的點(diǎn)鏈接起來。

對(duì)于第一幀圖像,我們將所有點(diǎn)均添加為新路徑。

接下來,如果len(path)== 1,我們?cè)谛聶z測(cè)到的對(duì)象中找到與每條路徑最后一點(diǎn)距離最近的對(duì)象。

如果len(path)> 1,則使用路徑中的最后兩個(gè)點(diǎn),即在同一條線上預(yù)測(cè)新點(diǎn),并找到該點(diǎn)與當(dāng)前點(diǎn)之間的最小距離。

具有最小距離的點(diǎn)將添加到當(dāng)前路徑的末端并從列表中刪除。如果在此之后還剩下一些點(diǎn),我們會(huì)將其添加為新路徑。這個(gè)過程中我們還會(huì)限制路徑中的點(diǎn)數(shù)。

new_pathes = []
for path in self.pathes:
      _min = 999999
      _match = None
for p in points:
if len(path) == 1:
              # distance from last point to current
              d = utils.distance(p[0], path[-1][0])
else:
              # based on 2 prev points predict next point and calculate
              # distance from predicted next point to current
              xn = 2 * path[-1][0][0] - path[-2][0][0]
              yn = 2 * path[-1][0][1] - path[-2][0][1]
              d = utils.distance(
                  p[0], (xn, yn),
                  x_weight=self.x_weight,
                  y_weight=self.y_weight
              )


if d < _min:
              _min = d
              _match = p


if _match and _min <= self.max_dst:
          points.remove(_match)
          path.append(_match)
          new_pathes.append(path)


      # do not drop path if current frame has no matches
if _match is None:
          new_pathes.append(path)


self.pathes = new_pathes


  # add new pathes
if len(points):
for p in points:
          # do not add points that already should be counted
if self.check_exit(p[1]):
continue
self.pathes.append([p])


  # save only last N points in path
for i, _ in enumerate(self.pathes):
self.pathes[i] = self.pathes[i][self.path_size * -1:]

現(xiàn)在,我們將嘗試計(jì)算進(jìn)入出口區(qū)域的車輛。為此,我們需獲取路徑中的最后2個(gè)點(diǎn),并檢查len(path)是否應(yīng)大于限制。

# count vehicles and drop counted pathes:
    new_pathes = []
for i, path in enumerate(self.pathes):
        d = path[-2:]
if (
# need at list two points to count
            len(d) >= 2 and
# prev point not in exit zone
            not self.check_exit(d[0][1]) and
# current point in exit zone
self.check_exit(d[1][1]) and
# path len is bigger then min
self.path_size <= len(path)
        ):
self.vehicle_count += 1
else:
# prevent linking with path that already in exit zone
            add = True
for p in path:
if self.check_exit(p[1]):
                    add = False
break
if add:
                new_pathes.append(path)
self.pathes = new_pathes


    context['pathes'] = self.pathes
    context['objects'] = objects
    context['vehicle_count'] = self.vehicle_count 
self.log.debug('#VEHICLES FOUND: %s' % self.vehicle_count)
return context

最后兩個(gè)處理器是CSV編寫器,用于創(chuàng)建報(bào)告CSV文件,以及用于調(diào)試和精美圖片的可視化。

class CsvWriter(PipelineProcessor):
def __init__(self, path, name, start_time=0, fps=15):
super(CsvWriter, self).__init__()
self.fp = open(os.path.join(path, name), 'w')
self.writer = csv.DictWriter(self.fp, fieldnames=['time', 'vehicles'])
self.writer.writeheader()
self.start_time = start_time
self.fps = fps
self.path = path
self.name = name
self.prev = None
def __call__(self, context):
            frame_number = context['frame_number']
            count = _count = context['vehicle_count']
if self.prev:
                _count = count - self.prev
            time = ((self.start_time + int(frame_number / self.fps)) * 100
                    + int(100.0 / self.fps) * (frame_number % self.fps))
self.writer.writerow({'time': time, 'vehicles': _count})
self.prev = count
return context
class Visualizer(PipelineProcessor):
def __init__(self, save_image=True, image_dir='images'):
super(Visualizer, self).__init__()
self.save_image = save_image
self.image_dir = image_dir
def check_exit(self, point, exit_masks=[]):
for exit_mask in exit_masks:
if exit_mask[point[1]][point[0]] == 255:
return True
return False
def draw_pathes(self, img, pathes):
if not img.any():
return
for i, path in enumerate(pathes):
                path = np.array(path)[:, 1].tolist()
for point in path:
                    cv2.circle(img, point, 2, CAR_COLOURS[0], -1)
                    cv2.polylines(img, [np.int32(path)], False, CAR_COLOURS[0], 1)
return img
def draw_boxes(self, img, pathes, exit_masks=[]):
for (i, match) in enumerate(pathes):
                contour, centroid = match[-1][:2]
if self.check_exit(centroid, exit_masks):
                    continue
                x, y, w, h = contour
                cv2.rectangle(img, (x, y), (x + w - 1, y + h - 1),
                              BOUNDING_BOX_COLOUR, 1)
                cv2.circle(img, centroid, 2, CENTROID_COLOUR, -1)
return img
def draw_ui(self, img, vehicle_count, exit_masks=[]):
# this just add green mask with opacity to the image
for exit_mask in exit_masks:
                _img = np.zeros(img.shape, img.dtype)
                _img[:, :] = EXIT_COLOR
                mask = cv2.bitwise_and(_img, _img, mask=exit_mask)
                cv2.addWeighted(mask, 1, img, 1, 0, img)
# drawing top block with counts
            cv2.rectangle(img, (0, 0), (img.shape[1], 50), (0, 0, 0), cv2.FILLED)
            cv2.putText(img, ("Vehicles passed: {total} ".format(total=vehicle_count)), (30, 30),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 255), 1)
return img
def __call__(self, context):
            frame = context['frame'].copy()
            frame_number = context['frame_number']
            pathes = context['pathes']
            exit_masks = context['exit_masks']
            vehicle_count = context['vehicle_count']
            frame = self.draw_ui(frame, vehicle_count, exit_masks)
            frame = self.draw_pathes(frame, pathes)
            frame = self.draw_boxes(frame, pathes, exit_masks)
            utils.save_frame(frame, self.image_dir +
"/processed_%04d.png" % frame_number)
return context

結(jié)論

正如我們看到的那樣,它并不像許多人想象的那么難。但是,如果小伙伴運(yùn)行腳本,小伙伴會(huì)發(fā)現(xiàn)此解決方案并不理想,存在前景對(duì)象存在重疊的問題,并且它也沒有按類型對(duì)車輛進(jìn)行分類。但是,當(dāng)相機(jī)有較好位置,例如位于道路正上方時(shí),該算法具有很好的準(zhǔn)確性。

責(zé)任編輯:彭菁

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

    關(guān)注

    1

    文章

    436

    瀏覽量

    20059
  • 計(jì)算機(jī)視覺
    +關(guān)注

    關(guān)注

    8

    文章

    1704

    瀏覽量

    46449
  • OpenCV
    +關(guān)注

    關(guān)注

    31

    文章

    641

    瀏覽量

    42215

原文標(biāo)題:使用OpenCV實(shí)現(xiàn)道路車輛計(jì)數(shù)

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是計(jì)算機(jī)視覺計(jì)算機(jī)視覺的三種方法

    計(jì)算機(jī)視覺是指通過為計(jì)算機(jī)賦予人類視覺這一技術(shù)目標(biāo),從而賦能裝配線檢查到駕駛輔助和機(jī)器人等應(yīng)用。計(jì)算機(jī)缺乏像人類一樣憑直覺產(chǎn)生
    的頭像 發(fā)表于 11-16 16:38 ?5178次閱讀
    什么是<b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>視覺</b>?<b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>視覺</b>的三種方法

    機(jī)器視覺計(jì)算機(jī)視覺的關(guān)系簡(jiǎn)述

    ,以控制相應(yīng)的行為。因此,可以說,計(jì)算機(jī)視覺為機(jī)器視覺提供圖像和景物分析的理論及算法基礎(chǔ),機(jī)器視覺計(jì)算機(jī)
    發(fā)表于 05-13 14:57

    基于OpenCV的計(jì)算機(jī)視覺技術(shù)實(shí)現(xiàn)

    基于OpenCV的計(jì)算機(jī)視覺技術(shù)實(shí)現(xiàn)OpencV是用來實(shí)現(xiàn)計(jì)算機(jī)視覺相關(guān)技術(shù)的開放源碼工作庫(kù),是
    發(fā)表于 11-23 21:06 ?0次下載
    基于OpenCV的<b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>視覺</b>技術(shù)<b class='flag-5'>實(shí)現(xiàn)</b>

    基于線性CCD視覺信息的道路交通標(biāo)志識(shí)別系統(tǒng)

    基于線性CCD視覺信息的道路交通標(biāo)志識(shí)別系統(tǒng),適用于圖像識(shí)別類。
    發(fā)表于 04-28 09:49 ?6次下載

    計(jì)算機(jī)視覺與機(jī)器視覺區(qū)別

     “計(jì)算機(jī)視覺”,是指用計(jì)算機(jī)實(shí)現(xiàn)人的視覺功能,對(duì)客觀世界的三維場(chǎng)景的感知、識(shí)別和理解。計(jì)算機(jī)
    的頭像 發(fā)表于 12-08 09:27 ?1.3w次閱讀

    道路交通發(fā)展難點(diǎn)與智慧展望

    隨著生產(chǎn)經(jīng)濟(jì)的日益發(fā)展和提高,道路交通運(yùn)輸系統(tǒng)也得到了質(zhì)的改善。
    發(fā)表于 07-12 10:55 ?1542次閱讀

    計(jì)算機(jī)視覺技術(shù)簡(jiǎn)介

    由于“計(jì)算機(jī)視覺”反映了對(duì)視覺環(huán)境及其上下文的相對(duì)理解,因此,一些科學(xué)家認(rèn)為,該領(lǐng)域?yàn)槿斯ぶ悄茴I(lǐng)域鋪平了道路。那么什么是計(jì)算機(jī)
    發(fā)表于 07-11 11:24 ?4647次閱讀

    計(jì)算機(jī)視覺常用算法_計(jì)算機(jī)視覺有哪些分類

    本文主要介紹了計(jì)算機(jī)視覺常用算法及計(jì)算機(jī)視覺的分類。
    的頭像 發(fā)表于 07-30 17:34 ?1.4w次閱讀

    關(guān)于基于英特爾AI計(jì)算機(jī)視覺的邊緣計(jì)算設(shè)備

    當(dāng)前,中國(guó)正在大力推進(jìn)包括人工智能、5G和工業(yè)物聯(lián)網(wǎng)在內(nèi)的新基礎(chǔ)設(shè)施建設(shè),為智慧城市的發(fā)展注入新動(dòng)能。其中,城市的智能交通是至關(guān)重要的組成部分。通過對(duì)于人工智能、計(jì)算機(jī)視覺、云計(jì)算和大
    的頭像 發(fā)表于 09-16 15:12 ?2654次閱讀
    關(guān)于基于英特爾AI<b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>視覺</b>的邊緣<b class='flag-5'>計(jì)算</b>設(shè)備

    計(jì)算機(jī)視覺的基礎(chǔ)概念和現(xiàn)實(shí)應(yīng)用

    本文將介紹計(jì)算機(jī)視覺的基礎(chǔ)概念和現(xiàn)實(shí)應(yīng)用,對(duì)任何聽說過計(jì)算機(jī)視覺但不確定它是什么以及如何應(yīng)用的人,本文是了解計(jì)算機(jī)
    的頭像 發(fā)表于 11-08 10:10 ?1823次閱讀

    使用計(jì)算機(jī)視覺進(jìn)行電梯乘客計(jì)數(shù)

    電子發(fā)燒友網(wǎng)站提供《使用計(jì)算機(jī)視覺進(jìn)行電梯乘客計(jì)數(shù).zip》資料免費(fèi)下載
    發(fā)表于 06-12 15:35 ?0次下載
    使用<b class='flag-5'>計(jì)算機(jī)</b><b class='flag-5'>視覺</b>進(jìn)行電梯乘客<b class='flag-5'>計(jì)數(shù)</b>

    機(jī)器視覺計(jì)算機(jī)視覺的區(qū)別

    機(jī)器視覺計(jì)算機(jī)視覺的區(qū)別 機(jī)器視覺計(jì)算機(jī)視覺是兩個(gè)相關(guān)但不同的概念。雖然許多人使用這兩個(gè)術(shù)語(yǔ)
    的頭像 發(fā)表于 08-09 16:51 ?2293次閱讀

    計(jì)算機(jī)視覺屬于人工智能嗎

    和解釋視覺信息,從而實(shí)現(xiàn)對(duì)圖像和視頻的自動(dòng)分析和處理。 計(jì)算機(jī)視覺的基本概念 2.1 計(jì)算機(jī)視覺
    的頭像 發(fā)表于 07-09 09:11 ?1802次閱讀

    計(jì)算機(jī)視覺和機(jī)器視覺區(qū)別在哪

    ,旨在實(shí)現(xiàn)對(duì)圖像和視頻的自動(dòng)分析和理解。 機(jī)器視覺 機(jī)器視覺計(jì)算機(jī)視覺的一個(gè)分支,主要應(yīng)用于工業(yè)自動(dòng)化領(lǐng)域。它利用
    的頭像 發(fā)表于 07-09 09:22 ?702次閱讀

    計(jì)算機(jī)視覺的五大技術(shù)

    計(jì)算機(jī)視覺作為深度學(xué)習(xí)領(lǐng)域最熱門的研究方向之一,其技術(shù)涵蓋了多個(gè)方面,為人工智能的發(fā)展開拓了廣闊的道路。以下是對(duì)計(jì)算機(jī)視覺五大技術(shù)的詳細(xì)解析
    的頭像 發(fā)表于 07-10 18:26 ?2029次閱讀
    主站蜘蛛池模板: 亚洲高清网站 | 国模小丫大尺度啪啪人体 | 日本暴力喉深到呕吐hd | www亚洲欲色成人久久精品 | 亚洲精品中文字幕乱码三区一二 | 97福利影院| 在线亚洲一区二区 | 亚洲国产一区二区三区在线观看 | 国产精品成人免费观看 | 六月婷婷精品视频在线观看 | 稀缺资源呦视频在线网站 | 四虎永久免费在线 | 日本三级视频在线观看 | 依人成人 | 人人草人 | 五月婷色 | 四虎4hu永久免费国产精品 | 欧美色爱综合网 | 日韩欧美一区二区三区不卡视频 | 一区二区三区国模大胆 | 婷婷色爱区综合五月激情韩国 | 色女人在线 | 日本视频一区在线观看免费 | 久久婷婷激情综合色综合也去 | 黄色爱爱视频 | 一级视频片 | 99热久久精品免费精品 | 日韩精品一区二区在线观看 | 久久国产热| 国产拍拍 | 5g国产精品影院天天5g天天爽 | 第四色成人网 | 美女视频永久黄网站在线观看 | 天天摸天天操免费播放小视频 | 国产高清色视频免费看的网址 | 日韩毛片免费线上观看 | 国产精品视频久久久久久 | 四虎影院网址大全 | 天天狠狠弄夜夜狠狠躁·太爽了 | 久久国产综合 | 四虎国产精品永久在线 |