利用OpenCV实现高精度双目视觉测距项目实战

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:双目视觉技术借助OpenCV库,通过两个相机捕捉场景的左右视图进行三维空间信息获取。本文深入探讨了双目测距的原理、图像匹配和校正的关键知识点。首先介绍了基于视差计算的双目测距技术,随后讨论了使用SIFT、SURF、ORB等特征匹配方法进行图像匹配,并利用RANSAC算法提高匹配准确性。然后,文章探讨了如何通过OpenCV函数校正摄像头畸变,并保证匹配和测距的准确性。最后,文章指出双目校正和匹配策略的选择对性能的影响,并强调了在自动驾驶、无人机导航等领域的应用。掌握这些技术对于开发双目视觉应用至关重要,开发者可以通过学习和实践不断提升自己的能力。 HNY_CV_005.rar_opencv 图像_双目 测距_双目图像匹配_双目校正_双目测距 opencv

1. 双目视觉测距原理

双目视觉测距是计算机视觉领域的一项关键技术,它依托于人类双眼的视觉原理,通过两个从不同视角获取的图像,模拟人类的立体视觉感知来计算物体的三维位置信息。本章将揭开双目视觉的神秘面纱,探讨其背后的理论基础和关键概念,为读者提供一个坚实的理论平台。

双目视觉的理论基础

双目视觉的基本原理是通过测量同一场景下两个摄像头视角之间的差异(即视差),来推算出场景中各点的深度信息。这个原理在人类的视觉系统中天然存在,当我们的两只眼睛看到同一个物体时,由于观察角度不同,大脑会将两个略有不同的图像融合,产生立体视觉。在计算机视觉中,我们需要通过算法来模拟这一过程。

双目视觉的关键概念

在双目视觉系统中,以下几个关键概念是必须要掌握的:

  • 基线(Baseline) :指两个摄像头光心之间的水平距离。基线的长度直接影响系统的测距范围和精度。
  • 视差(Disparity) :同一物体点在两个摄像头图像平面上的对应点水平位置的差值。视差越大,表示物体离摄像头越近。
  • 焦距(Focal Length) :与传统相机一样,摄像头的焦距决定了摄像头的视角大小,也影响着深度信息的计算。

通过理解这些基本概念,我们能够进一步深入探讨双目视觉测距的具体实现方法和应用实践。在后续章节中,我们将详细分析双目视觉系统的校正、匹配和测距算法,以及在实际中的优化和应用。

2. OpenCV立体匹配模块应用

2.1 OpenCV立体匹配模块概述

2.1.1 立体匹配算法的选择与适用场景

立体匹配是双目视觉中的核心步骤,它决定了图像对的像素间对应关系的计算。OpenCV提供了多种立体匹配算法,每种算法有其特定的适用场景:

  • Block Matching :适用于对实时性要求不高但对准确度要求较高的场合。这种方法通过对图像进行分块,然后在对应块内寻找最佳匹配,因其简单快速而广泛使用。
  • Semi-Global Matching (SGBM) :适合于对精度有较高要求的应用,能够处理较为复杂的视差变化。SGBM算法通过全局能量最小化来获得视差图,因此处理速度相对较慢。
  • Graph Cuts :适用于视差连续性要求很高的场景,例如在平滑区域能够得到非常平滑的视差图。其缺点是计算成本高,不适用于大规模场景。

在选择算法时,需考虑实际应用场景中的精度要求、计算资源以及实时性要求。

2.1.2 立体匹配流程及参数设置

立体匹配的基本流程包括图像预处理、匹配代价计算、视差计算、视差图后处理等步骤。在OpenCV中,立体匹配模块封装了StereoBM类和StereoSGBM类,分别对应Block Matching和Semi-Global Matching算法。这些类提供了丰富的参数供用户根据需要进行调整:

  • blockSize :定义了Block Matching算法中的块大小,它影响匹配的准确度和抗噪能力。
  • numDisparities :指定视差搜索范围,影响视差图的分辨率。
  • P1, P2 :在StereoBM类中用于调节匹配代价计算的参数,而在StereoSGBM类中是用于调节Semi-Global代价聚合的参数。

这些参数的选择需要根据具体的应用场景进行细致的调整,以达到最优的匹配效果。

2.2 立体匹配算法的实践应用

2.2.1 Block Matching算法解析与实践
import cv2
from matplotlib import pyplot as plt

# 读取左右图像
left_image = cv2.imread('left.jpg', 0)
right_image = cv2.imread('right.jpg', 0)

# 创建StereoBM对象
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)

# 计算视差图
disparity = stereo.compute(left_image, right_image)

# 显示视差图
plt.imshow(disparity, 'gray')
plt.title('Block Matching Disparity')
plt.show()

上述代码中,首先使用 StereoBM_create 方法创建了一个 StereoBM 对象,并设置了 numDisparities blockSize 参数。然后使用 compute 方法计算了左右图像的视差图,并用matplotlib显示出来。

2.2.2 Semi-Global Block Matching算法解析与实践
# 创建StereoSGBM对象
stereo = cv2.StereoSGBM_create(minDisparity=0,
                                numDisparities=16,
                                blockSize=3,
                                P1=8 * 3 * 3**2,
                                P2=32 * 3 * 3**2,
                                disp12MaxDiff=1,
                                uniquenessRatio=10,
                                speckleWindowSize=100,
                                speckleRange=32)

# 计算视差图
disparity = stereo.compute(left_image, right_image)

# 显示视差图
plt.imshow(disparity / 16.0, 'gray')
plt.title('Semi-Global Block Matching Disparity')
plt.show()

在使用 StereoSGBM_create 创建 StereoSGBM 对象时,我们设置了多个参数,包括视差的最小值、视差范围、块大小等。通过这些参数调整,我们可以控制算法的精度和处理时间。计算得到的视差图,同样使用matplotlib显示出来。

接下来,我们将深入探讨SGBM算法的具体原理与实际应用。

3. SGBM算法计算视差图

3.1 SGBM算法原理详解

3.1.1 算法的基本思想和步骤

Semi-Global Matching(SGBM)算法是一种全局优化算法,其基本思想是通过最小化一个基于图像像素点及其邻域的一致性成本函数来求解视差图。这种全局一致性是通过沿图像的多个方向进行路径成本累加(path aggregation)来实现的,从而将局部匹配问题转换为一个更接近实际物理模型的全局匹配问题。

算法步骤如下: 1. 图像预处理 :首先对输入的左右图像进行灰度化处理和归一化,为后续步骤做准备。 2. 成本计算 :计算左右图像间各像素点之间的成本。成本计算通常基于像素值的差异,如绝对值差或平方差。 3. 路径成本累加 :在多个方向(水平、垂直及对角线等)上进行路径成本累加,以获得更准确的匹配结果。 4. 视差计算 :通过寻找最小路径成本对应位置来确定视差值。 5. 视差优化 :应用后处理步骤,比如中值滤波、视差图细化等来改善视差图的质量。

3.1.2 参数调整对结果的影响

SGBM算法有多个可调参数,这些参数对最终的视差图质量有重大影响。理解这些参数的作用及如何调整它们对优化算法性能至关重要:

  • P1 和 P2 :这两个参数用于调整路径成本函数。P1是相邻像素间匹配成本的惩罚项,而P2是对路径成本累加的惩罚项。P1和P2的值决定了视差图的平滑程度和边缘的锐度。
  • minDisparity 和 numDisparities :minDisparity定义了视差搜索的起始位置,而numDisparities定义了视差搜索的范围。这两个参数决定了视差图的视差范围和分辨率。
  • disparityMultiplier :此参数用于调整视差值的缩放,影响最终视差图的输出范围。

调整这些参数时,需考虑应用的具体需求。例如,如果需要更高的视差图分辨率,可能会降低minDisparity和增加numDisparities的值;如果场景中存在更多平滑区域,可能会增加P1和P2的值以增强平滑性。

3.2 SGBM算法实践应用

3.2.1 使用SGBM算法进行视差计算

下面的代码块展示了如何使用OpenCV库中的 cv2.StereoSGBM 类进行视差计算:

import cv2
import numpy as np

# 创建SGBM对象
sgbm = cv2.StereoSGBM_create(
    minDisparity=0,
    numDisparities=16*5,  # 设置视差搜索范围
    blockSize=3,
    P1=8*3*3,
    P2=32*3*3,
    disp12MaxDiff=1,
    uniquenessRatio=10,
    speckleWindowSize=100,
    speckleRange=32
)

# 读取左右图像
left_image = cv2.imread('left.png', 0)  # 左图像为灰度图
right_image = cv2.imread('right.png', 0)  # 右图像为灰度图

# 计算视差图
disparity = sgbm.compute(left_image, right_image).astype(np.float32) / 16.0

# 将视差图归一化到0-255,便于显示
cv2.normalize(disparity, disparity, 0, 255, cv2.NORM_MINMAX)
disparity = np.uint8(disparity)
cv2.imshow('Disparity', disparity)
cv2.waitKey(0)

3.2.2 视差图优化与处理

在获得了初步的视差图之后,通常需要进行进一步的优化处理,以提高视差图的质量。这些处理方法包括但不限于:

  • 中值滤波 :减少视差图的噪声。
  • 视差图细化 :提高视差图的细节表现,特别是边缘部分。
  • 视差范围校正 :根据实际需要对视差值进行缩放或偏移。
  • 错误视差剔除 :移除那些不可能或错误的视差值,例如使用一致性检查。

代码块中展示了一个简单的视差图细化方法,通过对视差图应用后处理步骤,以获取更清晰的边缘信息:

# 对视差图进行后处理细化
disparity_filtered = cv2.ximgproc.smoothDisparity(disparity, None, 11, 3)

# 显示处理后的视差图
cv2.imshow('Refined Disparity', disparity_filtered)
cv2.waitKey(0)

经过处理的视差图将在后续的深度图转换中更为准确,为最终应用提供有力支持。在本章中,我们详细解析了SGBM算法的工作原理,包括其基本思想、参数调整技巧以及实践中的应用方式。通过分析代码逻辑和参数设置,我们得以对算法有一个全面的理解,并能根据实际需要进行相应的调整和优化。

4. 双目图像匹配技术

4.1 特征匹配方法

4.1.1 SIFT特征匹配

尺度不变特征变换(SIFT)是一种被广泛应用于图像处理领域的特征描述子算法。SIFT特征匹配的核心在于找到两幅图像中具有相似特征的点,并且这些特征点对旋转、尺度缩放、亮度变化甚至一定程度上的视角变化保持不变性。

为了实现SIFT特征匹配,首先需要对双目摄像头拍摄的图像进行SIFT特征检测。SIFT检测器将会在每张图片中找出关键点,并为每个关键点生成一个方向和尺度不变的描述符。接下来使用匹配算法,比如最近邻匹配,来找到两幅图像中相似的特征点。

import cv2
import numpy as np

# 加载图片并转换为灰度图
img1 = cv2.imread('left_image.jpg', 0)  # queryimage
img2 = cv2.imread('right_image.jpg', 0) # trainimage

# 初始化SIFT检测器
sift = cv2.SIFT_create()

# 检测SIFT特征
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

# 创建匹配器并进行匹配
matcher = cv2.BFMatcher()
matches = matcher.knnMatch(des1, des2, k=2)

# 绘制前10个匹配点
for m,n in matches[:10]:
    print(m.trainIdx, m.queryIdx)
    img3 = cv2.drawMatches(img1,kp1,img2,kp2,[m], None, flags=2)

cv2.imshow('Matches', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,首先利用 cv2.SIFT_create() 创建SIFT检测器,然后分别对左右图像进行特征检测和描述。之后使用 cv2.BFMatcher() 来构建一个暴力匹配器,并对特征进行k-最近邻匹配。匹配结果通过 cv2.drawMatches() 绘制出来,其中的 flags 参数可以用来调整显示匹配的方式。

4.1.2 SURF特征匹配

加速稳健特征(SURF)是SIFT的加速版本,由Herbert Bay等人开发,它在保持SIFT特征的不变性的同时,加快了特征提取和匹配的速度。SURF算法特别适合于对实时性要求较高的场合。

SURF算法实现的关键步骤与SIFT类似,但在关键点检测和特征描述子的生成上有自己的优化方法。以下是使用SURF进行特征匹配的代码示例:

import cv2
import numpy as np

# 加载图片并转换为灰度图
img1 = cv2.imread('left_image.jpg', 0)
img2 = cv2.imread('right_image.jpg', 0)

# 初始化SURF检测器
surf = cv2.xfeatures2d.SURF_create()

# 检测SURF特征
kp1, des1 = surf.detectAndCompute(img1, None)
kp2, des2 = surf.detectAndCompute(img2, None)

# 创建匹配器并进行匹配
matcher = cv2.BFMatcher()
matches = matcher.knnMatch(des1, des2, k=2)

# 绘制前10个匹配点
for m,n in matches[:10]:
    print(m.trainIdx, m.queryIdx)
    img3 = cv2.drawMatches(img1,kp1,img2,kp2,[m], None, flags=2)

cv2.imshow('Matches', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

此代码段与SIFT的代码段在结构上是相似的,不同的在于使用的特征检测器是 cv2.xfeatures2d.SURF_create()

4.1.3 ORB特征匹配

ориентed FAST and rotated BRIEF (ORB)是一种较新的特征检测和描述子算法,旨在替代较慢的SIFT和SURF算法。ORB是由Ethan Rublee等人提出的,它是完全免费的,并且在多种情况下性能优于SIFT和SURF。

ORB算法包括FAST关键点检测器和BRIEF描述子,但对它们进行了增强,以提供旋转不变性。以下是使用ORB进行特征匹配的代码示例:

import cv2
import numpy as np

# 加载图片并转换为灰度图
img1 = cv2.imread('left_image.jpg', 0)
img2 = cv2.imread('right_image.jpg', 0)

# 初始化ORB检测器
orb = cv2.ORB_create()

# 检测ORB特征
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)

# 创建匹配器并进行匹配
matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = matcher.match(des1, des2)

# 根据距离排序
matches = sorted(matches, key=lambda x: x.distance)

# 绘制前10个匹配点
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2)

cv2.imshow('Matches', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

此代码段中使用 cv2.ORB_create() 来创建ORB检测器,并用 cv2.BFMatcher() 进行匹配。注意ORB匹配器中 crossCheck=True 参数确保匹配的对称性,以提高匹配的质量。

4.2 几何验证与错误匹配排除

4.2.1 算法的几何约束条件

特征匹配是基于图像的局部信息来寻找两幅图像间的对应关系,但是由于图像噪声、光照变化或遮挡等问题,难免会产生错误匹配。为了提高匹配的准确性,我们通常会采用一些几何验证方法来剔除错误匹配。

常见的几何约束包括:RANSAC(随机抽样一致)算法、Lowe's Ratio Test以及基于这些方法的变种。RANSAC算法能有效剔除错误的匹配对,即使在存在大量错误匹配的情况下也能找到稳健的模型参数。

下面给出一个使用RANSAC算法进行几何验证的代码示例:

import cv2
import numpy as np

# 加载图片并转换为灰度图
img1 = cv2.imread('left_image.jpg', 0)
img2 = cv2.imread('right_image.jpg', 0)

# 初始化SIFT检测器
sift = cv2.SIFT_create()

# 检测SIFT特征
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

# 创建BFMatcher进行匹配
matcher = cv2.BFMatcher()
matches = matcher.knnMatch(des1, des2, k=2)

# 应用Lowe's ratio test进行初步筛选
good_matches = []
for m, n in matches:
    if m.distance < 0.75 * n.distance:
        good_matches.append(m)

# 提取匹配点的坐标
src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)

# 使用RANSAC算法进行几何验证
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
matchesMask = mask.ravel().tolist()

# 绘制匹配的点对
img3 = cv2.drawMatches(img1, kp1, img2, kp2, [m for i, m in enumerate(matches) if matchesMask[i]], None, flags=2)

cv2.imshow('Matches', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,首先利用 good_matches 列表来存储满足Lowe's ratio test的匹配对。然后,使用 cv2.findHomography() 找到一个满足RANSAC一致性的单应性矩阵 M mask 参数用于指示哪些匹配点是内点(即几何一致性好的点)。最后, cv2.drawMatches() 绘制出经过几何验证的匹配点。

4.2.2 错误匹配的识别与排除策略

错误匹配的识别与排除是提高匹配精度的重要步骤。常用的策略有基于距离的筛选、基于空间一致性的筛选以及基于模型的一致性筛选。

基于距离的筛选主要是应用某种距离阈值来剔除不稳定的匹配,例如Lowe's ratio test。基于空间一致性的筛选则是在利用图像的局部邻域信息来进一步剔除错误匹配,例如使用KNN(k-最近邻)算法来考虑局部一致性。基于模型的一致性筛选则是利用图像间对应点的几何模型来剔除错误匹配,如使用单应性矩阵来筛选内点。

例如,可以使用 cv2.findHomography() 函数来进行基于模型的一致性筛选。通过检查匹配点的对应关系是否符合单应性模型,可以筛选出符合几何一致性的匹配点。代码中已经展示了如何利用RANSAC算法来实现这一点。

4.2.3 错误匹配排除的代码优化

在实际应用中,错误匹配的识别和排除往往需要反复迭代,对匹配参数进行微调以达到最优的匹配效果。在上述代码中,可以调整Lowe's ratio test的阈值以及RANSAC算法的迭代次数来改善匹配的质量。

错误匹配的识别和排除是一个不断迭代和优化的过程,涉及到调整匹配策略和参数。在进行匹配的过程中,开发者应该根据具体应用场景来对算法进行精细的调整,以实现最佳的匹配效果。

5. 双目视觉测距技术在工业应用中的作用

双目视觉测距技术在精确测量、质量控制、自动化生产等多个方面展现了其在工业领域的重要作用。这一技术能够提供三维空间的深度信息,从而使得机器可以理解和“看到”周围的环境,为自动化决策和控制提供支持。

5.1 双目图像校正方法

5.1.1 校正的原理和方法

双目视觉系统中的两个摄像头往往不完全对齐,这就需要进行图像校正。图像校正的目的在于消除摄像头间的内参和外参不一致,使得两个摄像头的成像平面共面,并且保证成像时的视线共线。这一步骤对于之后的图像匹配至关重要。

常用的校正方法包括基于标定板的方法和无标定方法。基于标定板的方法通过已知几何特征的标定板来计算摄像头的内外参数,然后进行重投影校正。无标定方法则通常依赖于图像之间的几何特征进行估计。

5.1.2 校正过程中的常见问题及解决方案

在图像校正过程中,常见的问题之一是标定板的识别错误,这可能导致校正参数不准确。为了提高准确性,可以在多次拍摄后使用多种标定方法进行交叉验证。

另一个问题是摄像头间存在不一致性,这需要精细调整镜头参数,或者在后期使用图像处理技术进行补充校正。对于畸变严重的摄像头,也可以事先进行畸变校正,以提高校正精度。

5.2 相机标定与畸变系数获取

5.2.1 相机标定的意义和方法

相机标定是确定相机模型参数的过程,这些参数包括焦距、主点坐标、镜头畸变系数等。准确的标定可以提高双目视觉系统的测量精度,是系统构建的基础。

标定过程通常使用棋盘格、圆形格或专用标定板进行。标定算法会根据摄像头捕捉到的标定板图像,计算出每个摄像头的内参和外参。OpenCV提供了一些现成的函数,比如 cv::calibrateCamera ,可以通过最小化重投影误差来找到最佳的参数。

5.2.2 畸变系数的计算与应用

畸变系数描述了图像中的径向和切向畸变程度。这些系数在进行图像校正时非常关键,因为它们直接影响到图像质量。计算畸变系数通常包括图像采集、特征点检测、初始参数估计、畸变系数优化等步骤。

一旦获得畸变系数,我们就可以利用它们校正图像中的畸变。这一步骤是获得高质量匹配图像的前提,特别是在要求高精度测量的应用中尤为重要。

5.3 视觉应用中的深度图转换

5.3.1 深度图的意义和生成方法

深度图是一种表示物体距离的二维图像,其中每个像素点的值代表该点到摄像头的距离。深度图能够直观地反映出场景的三维结构,对于机器识别和理解场景非常重要。

生成深度图的主要方法之一是通过双目匹配算法,如Semi-Global Matching(SGBM),将匹配得到的视差信息转化为深度信息。深度值计算通常基于摄像头的几何关系、内参和视差图。

5.3.2 深度图在工业检测中的应用实例

在工业检测中,深度图可以帮助自动化系统检测产品质量。例如,在电子制造行业,深度图可用于检测电路板上的元件位置是否正确,以及焊接点的高度是否符合标准。

深度图还可以用于三维重建、三维打印等工业生产过程。通过精确地测量物体的三维尺寸和形状,深度图使得机器可以更加精确地控制制造过程,从而提高产品的质量。

在双目视觉系统中,深度图的生成和应用大大扩展了计算机视觉在工业中的应用范围,提高了自动化和智能化的水平。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:双目视觉技术借助OpenCV库,通过两个相机捕捉场景的左右视图进行三维空间信息获取。本文深入探讨了双目测距的原理、图像匹配和校正的关键知识点。首先介绍了基于视差计算的双目测距技术,随后讨论了使用SIFT、SURF、ORB等特征匹配方法进行图像匹配,并利用RANSAC算法提高匹配准确性。然后,文章探讨了如何通过OpenCV函数校正摄像头畸变,并保证匹配和测距的准确性。最后,文章指出双目校正和匹配策略的选择对性能的影响,并强调了在自动驾驶、无人机导航等领域的应用。掌握这些技术对于开发双目视觉应用至关重要,开发者可以通过学习和实践不断提升自己的能力。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

实现效果:http://v.youku.com/v_show/id_XMTU2Mzk0NjU3Ng==.html 如何在你的电脑上运行这个程序? 1,它需要cvblobslib这一个opencv的扩展库来实现检测物体与给物体画框的功能,具体安装信息请见: http://dsynflo.blogspot.com/2010/02/cvblobskib-with-opencv-installation.html,当你配置好cvblobslib之后,你可以用这一的程序进行测试:http://dl.dropbox.com/u/110310945/Blobs%20test.rar 2,视频中两个摄像头之间的距离是6cm,你可以根据你摄像头的型号,来选择合适的距离来达到最好的效果。 3,在进行测距之前,首先需要对摄像头进行标定,那么如何标定呢? 在stdafx.h中把"#define CALIBRATION 0"改成 “#define CALIBRATION 1”表示进行标定,标定之后,你就可以在工程目录下的"CalibFile" 文件夹中得到标定信息的文件。如果标定效果还不错,你就可以吧"#define CALIBRATION " 改成0,以后就不需要再标定,直接使用上一次的标定信息。你还需要把"#define ANALYSIS_MODE 1"这行代码放到stdafx.h中。 4,视频中使用的是10*7的棋牌格,共摄录40帧来计算摄像头的各种参数,如果你像使用其他棋盘格,可以在 "StereoFunctions.cpp"文件中修改相应参数。 5,如果你无法打开摄像头,可以在 "StereoGrabber.cpp"文件中修改代码“cvCaptureFromCAM(index)”中index的值。 6,About computing distance: it interpolates the relationship between depth-value and real-distance to third degree polynomial. So i used excel file "interpolation" for interpolation to find k1 to k4, you should find your own value of these parameters. 7,你可以通过调整控制窗口中各个参数的滑块,从而来得到更好的视差图。 8,在目录下的”distance“文件夹中,有计算距离信息的matlab代码。 9,如果你想了解基本的理论,可以看一下这个文档:http://scholar.lib.vt.edu/theses/available/etd-12232009-222118/unrestricted/Short_NJ_T_2009.pdf 视频中环境:vs2008,opencv2.1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值