Adept Technology 工业机器人系列编程:Quattro s125_机器人视觉系统与图像处理编程

机器人视觉系统与图像处理编程

在这里插入图片描述

1. 机器人视觉系统简介

机器人视觉系统是工业机器人中的一项关键技术,通过摄像头捕捉图像,对图像进行处理和分析,从而实现对环境的感知和目标的识别。在工业自动化中,视觉系统可以用于多种任务,如零件识别、定位、质量检测、装配等。Adept Technology 的 Quattro s125 机器人配备了先进的视觉系统,支持多种图像处理算法和工具,使得机器人能够高效地完成复杂的视觉任务。

1.1 机器人视觉系统的组成

机器人视觉系统主要由以下几个部分组成:

  1. 摄像头:用于捕捉图像,常见的摄像头类型包括单目摄像头、双目摄像头、3D摄像头等。
  2. 光源:用于改善图像质量,常见的光源类型包括LED灯、结构光等。
  3. 图像处理单元:用于处理和分析图像数据,通常由高性能的计算机或嵌入式系统实现。
  4. 软件开发工具:用于编程和配置视觉系统,Adept Technology 提供了丰富的视觉软件开发工具,如AdeptVision。

1.2 机器人视觉系统的应用

机器人视觉系统在工业自动化中的应用非常广泛,主要包括:

  1. 零件识别与定位:通过视觉系统识别和定位零件,指导机器人进行抓取和装配。
  2. 质量检测:检测产品的质量,如表面缺陷、尺寸偏差等。
  3. 环境感知:感知机器人工作环境,避免碰撞和提高安全性。
  4. 导航与路径规划:通过视觉系统获取环境信息,进行导航和路径规划。

2. AdeptVision 软件开发工具

AdeptVision 是Adept Technology 提供的视觉软件开发工具,支持多种图像处理算法和功能。通过AdeptVision,开发人员可以轻松地配置和编程视觉系统,实现复杂的图像处理任务。

2.1 AdeptVision 的主要功能

AdeptVision 提供了以下主要功能:

  1. 图像采集:从摄像头获取图像数据。
  2. 图像预处理:对图像进行灰度化、二值化、滤波等预处理操作。
  3. 特征提取:提取图像中的特征点、边缘、形状等。
  4. 目标识别:识别图像中的目标物体,支持多种识别算法。
  5. 坐标变换:将图像中的坐标转换为机器人坐标系。
  6. 通信接口:与机器人控制器进行通信,传递视觉处理结果。

2.2 AdeptVision 的安装与配置

  1. 安装:AdeptVision 可以从Adept Technology 的官方网站下载安装包,按照提示进行安装。
  2. 配置:安装完成后,需要配置摄像头和光源设备,以及选择合适的图像处理算法。

3. 图像采集

图像采集是视觉系统的第一步,通过摄像头获取图像数据。AdeptVision 提供了多种摄像头接口,支持不同类型的摄像头设备。

3.1 摄像头接口

AdeptVision 支持以下摄像头接口:

  1. GigE Vision:千兆以太网接口,适用于远程摄像头。
  2. USB3 Vision:USB3接口,适用于近距离摄像头。
  3. Camera Link:高速接口,适用于高帧率摄像头。

3.2 图像采集示例

以下是一个使用GigE Vision摄像头进行图像采集的示例代码:

// 导入必要的库
#include "AdeptVision.h"

// 定义摄像头对象
GigECamera camera;

// 初始化摄像头
void initializeCamera() {
    // 配置摄像头参数
    camera.setIPAddress("192.168.1.100");
    camera.setPort(5000);
    camera.setExposureTime(10000); // 曝光时间,单位为微秒
    camera.setGain(10); // 增益值
    camera.setFrameRate(30); // 帧率

    // 连接摄像头
    if (!camera.connect()) {
        std::cerr << "无法连接摄像头" << std::endl;
        exit(1);
    }
}

// 采集图像
void captureImage(cv::Mat &image) {
    // 捕获一帧图像
    if (!camera.capture(image)) {
        std::cerr << "图像采集失败" << std::endl;
        exit(1);
    }
}

// 主函数
int main() {
    cv::Mat image;

    // 初始化摄像头
    initializeCamera();

    // 采集图像
    captureImage(image);

    // 显示图像
    cv::imshow("Captured Image", image);
    cv::waitKey(0);

    return 0;
}

4. 图像预处理

图像预处理是图像处理的重要步骤,通过对图像进行灰度化、二值化、滤波等操作,提高后续处理的准确性和效率。

4.1 灰度化

灰度化是将彩色图像转换为灰度图像的过程。AdeptVision 提供了多种灰度化算法,如平均法、加权法等。

4.1.1 灰度化示例

以下是一个使用平均法进行灰度化的示例代码:

#include "AdeptVision.h"
#include <opencv2/opencv.hpp>

// 将彩色图像转换为灰度图像
void convertToGrayscale(const cv::Mat &input, cv::Mat &output) {
    // 使用OpenCV的cvtColor函数进行灰度化
    cv::cvtColor(input, output, cv::COLOR_BGR2GRAY);
}

int main() {
    cv::Mat colorImage, grayImage;

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 显示图像
    cv::imshow("Grayscale Image", grayImage);
    cv::waitKey(0);

    return 0;
}

4.2 二值化

二值化是将灰度图像转换为黑白图像的过程,通过设定阈值将像素分为两类。

4.2.1 二值化示例

以下是一个使用固定阈值进行二值化的示例代码:

#include "AdeptVision.h"
#include <opencv2/opencv.hpp>

// 使用固定阈值进行二值化
void binarizeImage(const cv::Mat &input, cv::Mat &output, int threshold) {
    // 使用OpenCV的threshold函数进行二值化
    cv::threshold(input, output, threshold, 255, cv::THRESH_BINARY);
}

int main() {
    cv::Mat colorImage, grayImage, binaryImage;

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 二值化
    binarizeImage(grayImage, binaryImage, 128);

    // 显示图像
    cv::imshow("Binary Image", binaryImage);
    cv::waitKey(0);

    return 0;
}

4.3 滤波

滤波是减少图像噪声、平滑图像的过程。常见的滤波算法包括高斯滤波、中值滤波等。

4.3.1 高斯滤波示例

以下是一个使用高斯滤波进行图像平滑的示例代码:

#include "AdeptVision.h"
#include <opencv2/opencv.hpp>

// 使用高斯滤波进行图像平滑
void gaussianBlur(const cv::Mat &input, cv::Mat &output, int kernelSize, double sigma) {
    // 使用OpenCV的GaussianBlur函数进行高斯滤波
    cv::GaussianBlur(input, output, cv::Size(kernelSize, kernelSize), sigma);
}

int main() {
    cv::Mat colorImage, grayImage, blurredImage;

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 高斯滤波
    gaussianBlur(grayImage, blurredImage, 5, 1.5);

    // 显示图像
    cv::imshow("Blurred Image", blurredImage);
    cv::waitKey(0);

    return 0;
}

5. 特征提取

特征提取是从图像中提取有用信息的过程,常见的特征包括边缘、角点、形状等。AdeptVision 提供了多种特征提取算法,如Canny边缘检测、Harris角点检测等。

5.1 边缘检测

边缘检测是识别图像中灰度变化显著的区域,常用于图像分割和目标检测。

5.1.1 Canny边缘检测示例

以下是一个使用Canny边缘检测算法的示例代码:

#include "AdeptVision.h"
#include <opencv2/opencv.hpp>

// 使用Canny边缘检测
void cannyEdgeDetection(const cv::Mat &input, cv::Mat &output, int lowThreshold, int highThreshold) {
    // 使用OpenCV的Canny函数进行边缘检测
    cv::Canny(input, output, lowThreshold, highThreshold);
}

int main() {
    cv::Mat colorImage, grayImage, edgeImage;

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 边缘检测
    cannyEdgeDetection(grayImage, edgeImage, 50, 150);

    // 显示图像
    cv::imshow("Edge Image", edgeImage);
    cv::waitKey(0);

    return 0;
}

5.2 角点检测

角点检测是识别图像中的角点,常用于目标定位和跟踪。

5.2.1 Harris角点检测示例

以下是一个使用Harris角点检测算法的示例代码:

#include "AdeptVision.h"
#include <opencv2/opencv.hpp>

// 使用Harris角点检测
void harrisCornerDetection(const cv::Mat &input, cv::Mat &output, double blockSize, double ksize, double k, double threshold) {
    // 使用OpenCV的cornerHarris函数进行角点检测
    cv::Mat dst;
    cv::cornerHarris(input, dst, blockSize, ksize, k);

    // 归一化角点检测结果
    cv::normalize(dst, dst, 0, 255, cv::NORM_MINMAX, CV_32FC1);
    cv::convertScaleAbs(dst, output);

    // 二值化角点检测结果
    cv::threshold(output, output, threshold, 255, cv::THRESH_BINARY);
}

int main() {
    cv::Mat colorImage, grayImage, cornerImage;

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 角点检测
    harrisCornerDetection(grayImage, cornerImage, 2, 3, 0.04, 100);

    // 显示图像
    cv::imshow("Corner Image", cornerImage);
    cv::waitKey(0);

    return 0;
}

6. 目标识别

目标识别是视觉系统的核心任务之一,通过图像处理算法识别图像中的目标物体。AdeptVision 支持多种目标识别算法,如模板匹配、特征匹配等。

6.1 模板匹配

模板匹配是通过比对模板图像和目标图像,找到模板图像在目标图像中的位置。

6.1.1 模板匹配示例

以下是一个使用模板匹配算法的示例代码:

#include "AdeptVision.h"
#include <opencv2/opencv.hpp>

// 使用模板匹配
void templateMatching(const cv::Mat &input, const cv::Mat &templateImage, cv::Point &topLeft, double &matchValue) {
    // 初始化结果图像
    cv::Mat result;
    int result_cols = input.cols - templateImage.cols + 1;
    int result_rows = input.rows - templateImage.rows + 1;
    result.create(result_rows, result_cols, CV_32FC1);

    // 进行模板匹配
    cv::matchTemplate(input, templateImage, result, cv::TM_CCOEFF_NORMED);

    // 找到匹配度最高的点
    double minVal, maxVal;
    cv::Point minLoc, maxLoc;
    cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);

    topLeft = maxLoc;
    matchValue = maxVal;
}

int main() {
    cv::Mat colorImage, grayImage, templateImage, templateGray;
    cv::Point topLeft;
    double matchValue;

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 读取模板图像
    templateImage = cv::imread("template.jpg", cv::IMREAD_COLOR);
    convertToGrayscale(templateImage, templateGray);

    // 模板匹配
    templateMatching(grayImage, templateGray, topLeft, matchValue);

    // 在原图上标记匹配位置
    cv::rectangle(colorImage, topLeft, cv::Point(topLeft.x + templateGray.cols, topLeft.y + templateGray.rows), cv::Scalar(0, 255, 0), 2);

    // 显示图像
    cv::imshow("Matched Image", colorImage);
    cv::waitKey(0);

    return 0;
}

6.2 特征匹配

特征匹配是通过提取和匹配图像中的特征点,找到目标物体的位置。常见的特征匹配算法包括SIFT、SURF等。

6.2.1 SIFT特征匹配示例

以下是一个使用SIFT特征匹配算法的示例代码:

#include "AdeptVision.h"
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>

// 使用SIFT特征匹配
void siftFeatureMatching(const cv::Mat &input, const cv::Mat &templateImage, std::vector<cv::KeyPoint> &inputKeypoints, std::vector<cv::KeyPoint> &templateKeypoints, cv::Mat &inputDescriptors, cv::Mat &templateDescriptors, std::vector<cv::DMatch> &matches) {
    // 创建SIFT检测器
    cv::Ptr<cv::xfeatures2d::SIFT> sift = cv::xfeatures2d::SIFT::create();

    // 提取特征点和描述符
    sift->detectAndCompute(input, cv::noArray(), inputKeypoints, inputDescriptors);
    sift->detectAndCompute(templateImage, cv::noArray(), templateKeypoints, templateDescriptors);

    // 创建匹配器
    cv::BFMatcher matcher(cv::NORM_L2);

    // 进行特征匹配
    matcher.match(inputDescriptors, templateDescriptors, matches);
}

int main() {
    cv::Mat colorImage, grayImage, templateImage, templateGray;
    std::vector<cv::KeyPoint> inputKeypoints, templateKeypoints;
    cv::Mat inputDescriptors, templateDescriptors;
    std::vector<cv::DMatch> matches;

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 读取模板图像
    templateImage = cv::imread("template.jpg", cv::IMREAD_COLOR);
    convertToGrayscale(templateImage, templateGray);

    // 特征匹配
    siftFeatureMatching(grayImage, templateGray, inputKeypoints, templateKeypoints, inputDescriptors, templateDescriptors, matches);

    // 在原图上绘制匹配结果
    cv::Mat matchedImage;
    cv::drawMatches(grayImage, inputKeypoints, templateGray, templateKeypoints, matches, matchedImage, cv::Scalar::all(-1), cv::Scalar::all(-1), std::vector<char>(), cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

    // 显示图像
    cv::imshow("Matched Image", matchedImage);
    cv::waitKey(0);

    return 0;
}

7. 坐标变换

坐标变换是将图像中的坐标转换为机器人坐标系的过程,使得机器人能够根据视觉系统的检测结果进行操作。图像坐标系和机器人坐标系之间的转换通常需要一个标定过程,通过标定板获取坐标变换矩阵。

7.1 图像坐标到机器人坐标系的转换

图像坐标系和机器人坐标系之间的转换通常需要一个标定过程,通过标定板获取坐标变换矩阵。这个矩阵可以通过一系列已知的图像点和对应的机器人点来计算。一旦获得了坐标变换矩阵,就可以将图像中的坐标转换为机器人坐标系中的坐标。

7.1.1 坐标变换示例

以下是一个将图像坐标转换为机器人坐标系的示例代码:

#include "AdeptVision.h"
#include <opencv2/opencv.hpp>

// 坐标变换矩阵
cv::Mat transformationMatrix = (cv::Mat_<double>(3, 3) << 1.0, 0.0, 0.0,
                                               0.0, 1.0, 0.0,
                                               0.0, 0.0, 1.0);

// 将图像坐标转换为机器人坐标
cv::Point2d transformPoint(const cv::Point2d &imagePoint) {
    // 创建齐次坐标
    cv::Mat pointHomogeneous = (cv::Mat_<double>(3, 1) << imagePoint.x, imagePoint.y, 1.0);

    // 进行坐标变换
    cv::Mat transformedPoint = transformationMatrix * pointHomogeneous;

    // 归一化
    transformedPoint /= transformedPoint.at<double>(2, 0);

    return cv::Point2d(transformedPoint.at<double>(0, 0), transformedPoint.at<double>(1, 0));
}

int main() {
    cv::Mat colorImage, grayImage, templateImage, templateGray;
    cv::Point topLeft;
    double matchValue;

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 读取模板图像
    templateImage = cv::imread("template.jpg", cv::IMREAD_COLOR);
    convertToGrayscale(templateImage, templateGray);

    // 模板匹配
    templateMatching(grayImage, templateGray, topLeft, matchValue);

    // 将匹配位置转换为机器人坐标
    cv::Point2d robotTopLeft = transformPoint(cv::Point2d(topLeft.x, topLeft.y));

    // 输出机器人坐标
    std::cout << "机器人坐标 (x, y): (" << robotTopLeft.x << ", " << robotTopLeft.y << ")" << std::endl;

    // 在原图上标记匹配位置
    cv::rectangle(colorImage, topLeft, cv::Point(topLeft.x + templateGray.cols, topLeft.y + templateGray.rows), cv::Scalar(0, 255, 0), 2);

    // 显示图像
    cv::imshow("Matched Image", colorImage);
    cv::waitKey(0);

    return 0;
}

7.2 标定过程

标定过程是获取坐标变换矩阵的关键步骤。通常,标定过程包括以下步骤:

  1. 准备标定板:标定板通常是一个具有已知几何特性的图案,如棋盘格。
  2. 采集标定图像:使用摄像头从不同角度和位置采集标定板的图像。
  3. 检测标定板角点:通过图像处理算法检测标定板的角点。
  4. 计算坐标变换矩阵:根据检测到的角点和已知的标定板几何特性,计算图像坐标到机器人坐标系的变换矩阵。
7.2.1 标定过程示例

以下是一个简单的标定过程示例代码:

#include "AdeptVision.h"
#include <opencv2/opencv.hpp>
#include <opencv2/calib3d.hpp>

// 标定板的角点数
int chessboardSize[2] = {9, 6};

// 标定板的角点实际距离
float squareSize = 0.025; // 25 mm

// 存储标定板角点的实际坐标
std::vector<cv::Point3f> objectPoints;

// 存储检测到的图像角点
std::vector<std::vector<cv::Point2f>> imagePoints;

// 初始化标定板角点
void initializeObjectPoints() {
    for (int i = 0; i < chessboardSize[1]; i++) {
        for (int j = 0; j < chessboardSize[0]; j++) {
            objectPoints.push_back(cv::Point3f(j * squareSize, i * squareSize, 0.0f));
        }
    }
}

// 标定过程
void calibrateCamera() {
    cv::Mat cameraMatrix = cv::Mat::eye(3, 3, CV_64F);
    cv::Mat distortionCoefficients = cv::Mat::zeros(5, 1, CV_64F);
    cv::Mat rvecs, tvecs;

    // 进行标定
    cv::calibrateCamera(objectPoints, imagePoints, cv::Size(grayImage.cols, grayImage.rows), cameraMatrix, distortionCoefficients, rvecs, tvecs);

    // 计算坐标变换矩阵
    cv::Mat rotationMatrix;
    cv::Rodrigues(rvecs.at<cv::Vec3d>(0), rotationMatrix);
    transformationMatrix = (cv::Mat_<double>(3, 3) << rotationMatrix.at<double>(0, 0), rotationMatrix.at<double>(0, 1), rotationMatrix.at<double>(0, 2),
                                               rotationMatrix.at<double>(1, 0), rotationMatrix.at<double>(1, 1), rotationMatrix.at<double>(1, 2),
                                               rotationMatrix.at<double>(2, 0), rotationMatrix.at<double>(2, 1), rotationMatrix.at<double>(2, 2));
}

int main() {
    cv::Mat colorImage, grayImage;
    cv::Point topLeft;
    double matchValue;

    // 初始化标定板角点
    initializeObjectPoints();

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 检测标定板角点
    bool found = cv::findChessboardCorners(grayImage, cv::Size(chessboardSize[0], chessboardSize[1]), imagePoints[0]);
    if (!found) {
        std::cerr << "未找到标定板角点" << std::endl;
        exit(1);
    }

    // 标定过程
    calibrateCamera();

    // 读取模板图像
    templateImage = cv::imread("template.jpg", cv::IMREAD_COLOR);
    convertToGrayscale(templateImage, templateGray);

    // 模板匹配
    templateMatching(grayImage, templateGray, topLeft, matchValue);

    // 将匹配位置转换为机器人坐标
    cv::Point2d robotTopLeft = transformPoint(cv::Point2d(topLeft.x, topLeft.y));

    // 输出机器人坐标
    std::cout << "机器人坐标 (x, y): (" << robotTopLeft.x << ", " << robotTopLeft.y << ")" << std::endl;

    // 在原图上标记匹配位置
    cv::rectangle(colorImage, topLeft, cv::Point(topLeft.x + templateGray.cols, topLeft.y + templateGray.rows), cv::Scalar(0, 255, 0), 2);

    // 显示图像
    cv::imshow("Matched Image", colorImage);
    cv::waitKey(0);

    return 0;
}

8. 通信接口

通信接口是视觉系统与机器人控制器之间进行数据交换的关键部分。AdeptVision 提供了多种通信接口,使得开发人员可以轻松地将视觉处理结果传递给机器人控制器。

8.1 通信接口类型

AdeptVision 支持以下通信接口类型:

  1. Ethernet:通过以太网接口与机器人控制器进行通信。
  2. Serial:通过串行接口与机器人控制器进行通信。
  3. USB:通过USB接口与机器人控制器进行通信。

8.2 通信接口示例

以下是一个使用Ethernet接口与机器人控制器进行通信的示例代码:

#include "AdeptVision.h"
#include <iostream>
#include <string>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

// 定义通信参数
const char *robotIP = "192.168.1.101";
const int robotPort = 5001;

// 与机器人控制器通信
void sendToRobot(const cv::Point2d &robotPoint) {
    // 创建套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        std::cerr << "无法创建套接字" << std::endl;
        exit(1);
    }

    // 配置套接字地址
    sockaddr_in serverAddress;
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(robotPort);
    if (inet_pton(AF_INET, robotIP, &serverAddress.sin_addr) <= 0) {
        std::cerr << "无效的地址或地址无法解析" << std::endl;
        exit(1);
    }

    // 连接机器人控制器
    if (connect(sock, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) {
        std::cerr << "连接失败" << std::endl;
        exit(1);
    }

    // 构建消息
    std::string message = "Robot Point: (" + std::to_string(robotPoint.x) + ", " + std::to_string(robotPoint.y) + ")";

    // 发送消息
    if (send(sock, message.c_str(), message.size(), 0) < 0) {
        std::cerr << "发送失败" << std::endl;
        exit(1);
    }

    // 关闭套接字
    close(sock);
}

int main() {
    cv::Mat colorImage, grayImage, templateImage, templateGray;
    cv::Point topLeft;
    double matchValue;

    // 初始化摄像头并采集图像
    initializeCamera();
    captureImage(colorImage);

    // 灰度化
    convertToGrayscale(colorImage, grayImage);

    // 读取模板图像
    templateImage = cv::imread("template.jpg", cv::IMREAD_COLOR);
    convertToGrayscale(templateImage, templateGray);

    // 模板匹配
    templateMatching(grayImage, templateGray, topLeft, matchValue);

    // 将匹配位置转换为机器人坐标
    cv::Point2d robotTopLeft = transformPoint(cv::Point2d(topLeft.x, topLeft.y));

    // 输出机器人坐标
    std::cout << "机器人坐标 (x, y): (" << robotTopLeft.x << ", " << robotTopLeft.y << ")" << std::endl;

    // 在原图上标记匹配位置
    cv::rectangle(colorImage, topLeft, cv::Point(topLeft.x + templateGray.cols, topLeft.y + templateGray.rows), cv::Scalar(0, 255, 0), 2);

    // 显示图像
    cv::imshow("Matched Image", colorImage);
    cv::waitKey(0);

    // 与机器人控制器通信
    sendToRobot(robotTopLeft);

    return 0;
}

9. 总结

机器人视觉系统是工业自动化中的关键技术,通过摄像头捕捉图像并进行处理和分析,实现对环境的感知和目标的识别。Adept Technology 的 Quattro s125 机器人配备了先进的视觉系统,支持多种图像处理算法和工具,使得机器人能够高效地完成复杂的视觉任务。AdeptVision 提供了丰富的功能,包括图像采集、预处理、特征提取、目标识别、坐标变换和通信接口,使得开发人员能够轻松地配置和编程视觉系统。通过本章的学习,读者应该能够理解机器人视觉系统的基本原理,并掌握使用AdeptVision进行图像处理的基本方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值