色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

如何基于計算機視覺實現道路交通計數

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

今天,我們將一起探討如何基于計算機視覺實現道路交通計數。

在本教程中,我們將僅使用Python和OpenCV,并借助背景減除算法非常簡單地進行運動檢測

我們將從以下四個方面進行介紹:

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

2. OpenCV圖像過濾器。

3. 利用輪廓檢測物體。

4. 建立進一步數據處理的結構。

背景扣除算法

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

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

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

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

我們將使用MOG算法進行背景扣除

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

去除背景后的前景圖像

我們可以看出前景圖像上有一些噪音,可以通過標準濾波技術可以將其消除。

濾波

針對我們現在的情況,我們將需要以下濾波函數:Threshold、Erode、Dilate、Opening、Closing。

首先,我們使用“Closing”來移除區域中的間隙,然后使用“Opening”來移除個別獨立的像素點,然后使用“Dilate”進行擴張以使對象變粗。代碼如下:

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

利用輪廓進行物體檢測

我們將使用cv2.findContours函數對輪廓進行檢測。我們在使用的時候可以選擇的參數為:

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

建立數據處理框架

我們都知道在ML和CV中,沒有一個算法可以處理所有問題。即使存在這種算法,我們也不會使用它,因為它很難大規模有效。例如幾年前Netflix公司用300萬美元的獎金懸賞最佳電影推薦算法。有一個團隊完成這個任務,但是他們的推薦算法無法大規模運行,因此其實對公司毫無用處。但是,Netflix公司仍獎勵了他們100萬美元。

接下來我們來建立解決當前問題的框架,這樣可以使數據的處理更加方便

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__)

首先我們獲取一張處理器運行順序的列表,讓每個處理器完成一部分工作,在案順序完成執行以獲得最終結果。

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

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

現在,讓我們創建一個處理器,該處理器將找出不同的幀上檢測到的相同對象,創建路徑,并對到達出口區域的車輛進行計數。代碼如下所示:

'''
        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

上面的代碼有點復雜,因此讓我們一個部分一個部分的介紹一下。

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

上面的圖像中綠色的部分是出口區域。我們在這里對車輛進行計數,只有當車輛移動的長度超過3個點我們才進行計算

我們使用掩碼來解決這個問題,因為它比使用矢量算法有效且簡單得多。只需使用“二進制和”即可選出車輛區域中點。設置方式如下:

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]    

現在我們將檢測到的點鏈接起來。

對于第一幀圖像,我們將所有點均添加為新路徑。

接下來,如果len(path)== 1,我們在新檢測到的對象中找到與每條路徑最后一點距離最近的對象。

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

具有最小距離的點將添加到當前路徑的末端并從列表中刪除。如果在此之后還剩下一些點,我們會將其添加為新路徑。這個過程中我們還會限制路徑中的點數。

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:]

現在,我們將嘗試計算進入出口區域的車輛。為此,我們需獲取路徑中的最后2個點,并檢查len(path)是否應大于限制。

# 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

最后兩個處理器是CSV編寫器,用于創建報告CSV文件,以及用于調試和精美圖片的可視化。

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

結論

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

責任編輯:彭菁

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 過濾器
    +關注

    關注

    1

    文章

    432

    瀏覽量

    19685
  • 計算機視覺
    +關注

    關注

    8

    文章

    1700

    瀏覽量

    46077
  • OpenCV
    +關注

    關注

    31

    文章

    635

    瀏覽量

    41463

原文標題:使用OpenCV實現道路車輛計數

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

收藏 人收藏

    評論

    相關推薦

    什么是計算機視覺計算機視覺的三種方法

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

    機器視覺計算機視覺的關系簡述

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

    基于OpenCV的計算機視覺技術實現

    基于OpenCV的計算機視覺技術實現OpencV是用來實現計算機視覺相關技術的開放源碼工作庫,是
    發表于 11-23 21:06 ?0次下載
    基于OpenCV的<b class='flag-5'>計算機</b><b class='flag-5'>視覺</b>技術<b class='flag-5'>實現</b>

    基于線性CCD視覺信息的道路交通標志識別系統

    基于線性CCD視覺信息的道路交通標志識別系統,適用于圖像識別類。
    發表于 04-28 09:49 ?6次下載

    計算機視覺與機器視覺區別

     “計算機視覺”,是指用計算機實現人的視覺功能,對客觀世界的三維場景的感知、識別和理解。計算機
    的頭像 發表于 12-08 09:27 ?1.3w次閱讀

    道路交通發展難點與智慧展望

    隨著生產經濟的日益發展和提高,道路交通運輸系統也得到了質的改善。
    發表于 07-12 10:55 ?1483次閱讀

    計算機視覺技術簡介

    由于“計算機視覺”反映了對視覺環境及其上下文的相對理解,因此,一些科學家認為,該領域為人工智能領域鋪平了道路。那么什么是計算機
    發表于 07-11 11:24 ?4548次閱讀

    計算機視覺常用算法_計算機視覺有哪些分類

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

    關于基于英特爾AI計算機視覺的邊緣計算設備

    當前,中國正在大力推進包括人工智能、5G和工業物聯網在內的新基礎設施建設,為智慧城市的發展注入新動能。其中,城市的智能交通是至關重要的組成部分。通過對于人工智能、計算機視覺、云計算和大
    的頭像 發表于 09-16 15:12 ?2531次閱讀
    關于基于英特爾AI<b class='flag-5'>計算機</b><b class='flag-5'>視覺</b>的邊緣<b class='flag-5'>計算</b>設備

    計算機視覺的基礎概念和現實應用

    本文將介紹計算機視覺的基礎概念和現實應用,對任何聽說過計算機視覺但不確定它是什么以及如何應用的人,本文是了解計算機
    的頭像 發表于 11-08 10:10 ?1604次閱讀

    使用計算機視覺進行電梯乘客計數

    電子發燒友網站提供《使用計算機視覺進行電梯乘客計數.zip》資料免費下載
    發表于 06-12 15:35 ?0次下載
    使用<b class='flag-5'>計算機</b><b class='flag-5'>視覺</b>進行電梯乘客<b class='flag-5'>計數</b>

    機器視覺計算機視覺的區別

    機器視覺計算機視覺的區別 機器視覺計算機視覺是兩個相關但不同的概念。雖然許多人使用這兩個術語
    的頭像 發表于 08-09 16:51 ?2074次閱讀

    計算機視覺屬于人工智能嗎

    和解釋視覺信息,從而實現對圖像和視頻的自動分析和處理。 計算機視覺的基本概念 2.1 計算機視覺
    的頭像 發表于 07-09 09:11 ?1383次閱讀

    計算機視覺和機器視覺區別在哪

    ,旨在實現對圖像和視頻的自動分析和理解。 機器視覺 機器視覺計算機視覺的一個分支,主要應用于工業自動化領域。它利用
    的頭像 發表于 07-09 09:22 ?506次閱讀

    計算機視覺的五大技術

    計算機視覺作為深度學習領域最熱門的研究方向之一,其技術涵蓋了多個方面,為人工智能的發展開拓了廣闊的道路。以下是對計算機視覺五大技術的詳細解析
    的頭像 發表于 07-10 18:26 ?1521次閱讀
    主站蜘蛛池模板: 冰山高冷受被c到哭np双性 | 国产麻豆AV伦 | 国产免费久久精品国产传媒 | 玩50岁四川熟女大白屁股直播 | 琪琪伦伦影院理论片 | 午夜视频在线瓜伦 | 蜜芽在线影片 | 最近的2019中文字幕国语版 | 97精品国产自产在线观看永久 | 在线观看成人3d动漫入口 | 黄页网站18以下勿看免费 | 久久精品一本到东京热 | 伊人久久大香线蕉综合高清 | 午夜爱情动作片P | 亚洲成色爱我久久 | 欧美国产在线一区 | 熟妇无码乱子成人精品 | 久久性综合亚洲精品电影网 | 2023国产精品一卡2卡三卡4卡 | 午夜亚洲动漫精品AV网站 | 国产成人久久精品AV | 亚洲国产亚综合在线区尤物 | 被黑人群jian又粗又大H | 国产亚洲va在线电影 | 99热都是精品 | 特大黑人娇小亚洲女mp4 | 九九免费高清在线观看视频 | 偷柏自拍亚洲综合在线 | 久久久精品久久久久久 | 全黄h全肉细节文在线观看 全黄H全肉细节文短篇 | 中文在线无码高潮潮喷在线 | 99久久精品国内 | 我在厨房摸岳的乳HD在线观看 | 在线免费视频国产 | 成片免费观看视频大全 | 亚洲精品无码午夜福利在线观看 | 香蕉久久夜色精品国产小优 | 国产国拍亚洲精品av麻豆 | 好男人资源免费观看1 | 亚洲日韩在线天堂一 | 精品视频网站 |