Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现获取图像并对图像进行边缘检测(C++)

Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现获取图像并对图像进行边缘检测(C++)

  • Baumer工业相机
  • Baumer工业相机使用OpenCV对图像进行边缘检测的技术背景
    • 在NEOAPI SDK里使用OpenCV建立边缘检测功能
    • 在NEOAPI SDK里使用边缘检测功能对图像进行边缘检测
  • 工业相机通过OpenCV对图像进行边缘检测的优势
  • 工业相机使用OpenCV对图像进行边缘检测的行业应用

Baumer工业相机

Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。

Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。

Baumer工业相机NEOAPI SDK是用于Baumer工业相机的一款最新的软件开发工具包(SDK)。它为开发人员提供了一系列API和工具,用于与Baumer工业相机进行通信和控制,控制方式极为便捷类似Halcon的相机助手类控制方式。​

OpenCV,全称Open Source Computer Vision Library,是一个开源的跨平台计算机视觉与机器视觉库。该库提供了丰富的图像处理和计算机视觉算法,涵盖了图像处理、特征检测、目标识别、运动跟踪等多个领域,适用于各种平台,包括Windows、Linux、Android和iOS等。OpenCV是由英特尔公司发起并开放源代码,是计算机视觉领域中广泛应用的一种工具。

注意:本文是基于Baumer的NEOAPI SDK的基础上联合OpenCV使用C++语言来实现相机对图像进行边缘检测。

Baumer工业相机使用OpenCV对图像进行边缘检测的技术背景

工业相机使用OpenCV进行图像边缘检测时,涉及到以下技术背景:

  1. 边缘检测算法:OpenCV中包含了许多经典的边缘检测算法,如Sobel、Canny、Laplacian等。这些算法可用于识别图像中的边缘区域,有助于提取出图像中重要的特征信息。

  2. 图像梯度:边缘检测的核心思想是利用图像中像素之间的梯度变化来识别边缘。Sobel和Laplacian算子可以分别用于计算图像中的水平和垂直梯度,而Canny算法则结合多种技术实现更加精确的边缘检测。

  3. 阈值处理:在边缘检测中,设置适当的阈值对梯度值进行处理是非常重要的。这有助于过滤掉噪声或非边缘区域的影响,从而提高边缘检测的准确度。

  4. 实时性和效率:工业相机通常需要实时进行图像处理,因此在选择边缘检测算法时需要考虑其计算复杂度和实时性能。OpenCV提供了针对性能优化的边缘检测算法,适合工业相机实时应用的需求。

  5. 应用场景:工业相机使用OpenCV进行边缘检测的应用场景包括产品质检、定位、测量等。通过边缘检测,可以有效提取并分析产品表面的特征,实现对产品的自动化检测和分析。

综上所述,工业相机使用OpenCV进行图像边缘检测时,需要深入理解边缘检测算法原理、图像梯度计算、阈值处理等技术背景知识,以实现对图像中边缘区域的准确提取和分析。

在NEOAPI SDK里使用OpenCV建立边缘检测功能

在相机连接后可以在NEOAPI SDK里使用OpenCV对建立边缘检测功能函数,C++调用代码如下所示:

#include <iostream>
#include <thread>
#include <vector>
#include <map>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/core/ocl.hpp"
#include "neoapi/neoapi.hpp"class EdgeDetector {public:explicit EdgeDetector(NeoAPI::NeoString serialnumber) {camera_.Connect(serialnumber);camera_.f().ExposureTime.Set(2500);// cv mats will created by width and height -> there is no space for chunk -> disable chunkcamera_.DisableChunk();try {camera_.f().PixelFormat.Set(NeoAPI::PixelFormat::BayerRG8);} catch (NeoAPI::FeatureAccessException&) {camera_.f().PixelFormat.Set(NeoAPI::PixelFormat::Mono8);}pixel_format_ = camera_.f().PixelFormat.Get();identifier_ = serialnumber;}~EdgeDetector() {Stop();FreeCamBuffers();}// setups the edge detector to do processing with the requested typevoid Setup(MemoryMode memtype) {cv::ocl::setUseOpenCL(MemoryMode::cpu != memtype);if (cv::ocl::Device::getDefault().hostUnifiedMemory()) {  // do not use svm functions if this failestry {cv::ocl::Context::getDefault().setUseSVM(MemoryMode::shared == memtype);}catch(...) {memtype = MemoryMode::cpu;std::cout << "SVM Error: falling back to cpu memory!" << std::endl;}}SetupBuffers(3, memtype);camera_.SetUserBufferMode();}// single edge detection on a given imagevoid Detect(const NeoAPI::Image& image, bool show_image) {cv::UMat *img_mat = &(image.GetUserBuffer<CamBuffer*>()->gpu_mat_);if (NeoAPI::PixelFormat::BayerRG8 == pixel_format_) {cv::cvtColor(*img_mat, grey_mat_, cv::COLOR_BayerRG2GRAY);} else {grey_mat_ = *img_mat;}cv::GaussianBlur(grey_mat_, gauss_mat_, cv::Size(5, 5), 0);cv::Sobel(gauss_mat_, sobel_mat_, sobel_mat_.depth(), 1, 1, 5);if (show_image) {cv::imshow(identifier_, sobel_mat_);cv::pollKey();}++frames_;}// returns the number of processed images since last callsize_t ProcessedFrames() {size_t ret = frames_;frames_ = 0;return ret;}// return the cameras serial numberconst cv::String& GetIdentifier() {return identifier_;}// starts a seperate thread that will do edge detection continouoslyvoid Start(bool show_images) {run_ = true;detect_thread_ = std::thread(&EdgeDetector::Detect_, this, show_images);}// stops a previous started continouosly edge detectionvoid Stop() {run_ = false;if (detect_thread_.joinable()) {detect_thread_.join();}}private:void FreeCamBuffers() {while (!buffers_.empty()) {delete buffers_.back();buffers_.pop_back();}}void SetupBuffers(size_t count, MemoryMode memtype) {int width = static_cast<int>(camera_.f().Width.Get());int height = static_cast<int>(camera_.f().Height.Get());FreeCamBuffers();for (size_t i = 0; i < count; ++i) {buffers_.push_back(new CamBuffer(width, height, memtype));camera_.AddUserBuffer(buffers_.back());}// allocate processing matrices because operations cannot run in place// some opencv versions use the wrong constructor -> create the mats objects with explicit memory typegrey_mat_ = cv::UMat();gauss_mat_ = cv::UMat();sobel_mat_ = cv::UMat();grey_mat_.create(cv::Size(width, height), CV_8UC1, static_cast<cv::UMatUsageFlags>(memtype));gauss_mat_.create(cv::Size(width, height), CV_8UC1, static_cast<cv::UMatUsageFlags>(memtype));sobel_mat_.create(cv::Size(width, height), CV_8UC1, static_cast<cv::UMatUsageFlags>(memtype));}void Detect_(bool show_images) {try {while (run_) {NeoAPI::Image image = camera_.GetImage();if (image.IsEmpty()) {std::cout << identifier_ << " Error during acquisition!" << std::endl;break;} else {Detect(image, show_images);}}if (show_images) {cv::destroyWindow(identifier_);}} catch (NeoAPI::NeoException& exc) {std::cout << identifier_ << " error: " << exc.GetDescription() << std::endl;} catch (cv::Exception& exc) {std::cout << identifier_ <<  "cv error:" << exc.msg << std::endl;}}NeoAPI::Cam camera_;std::vector<CamBuffer*> buffers_;cv::String identifier_;cv::UMat grey_mat_;cv::UMat gauss_mat_;cv::UMat sobel_mat_;std::thread detect_thread_;size_t frames_ {0};NeoAPI::PixelFormat pixel_format_;bool run_ {false};
};

在NEOAPI SDK里使用边缘检测功能对图像进行边缘检测

在相机连接后可以在NEOAPI SDK里使用前面设计的函数对图像进行边缘检测,C++调用代码如下所示:

#include <iostream>
#include <thread>
#include <vector>
#include <map>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/core/ocl.hpp"
#include "neoapi/neoapi.hpp"void PrintMetrics(const std::vector<EdgeDetector*>& devices, size_t duration) {for (size_t secs = 0; secs < duration; ++secs) {std::this_thread::sleep_for(std::chrono::milliseconds(1000));  // print every second metricsfor (auto device : devices) {std::cout << device->GetIdentifier() << " fps: " << device->ProcessedFrames() << std::endl;}}
}void FindDevices(std::vector<EdgeDetector*> *devices) {for (auto device : NeoAPI::CamInfoList::Get()) {try {devices->push_back(new EdgeDetector(device.GetSerialNumber()));}catch (NeoAPI::NeoException& exc) {std::cout << exc.GetDescription() << std::endl;}}std::cout << devices->size() << " device(s) connected!" << std::endl;
}void GetGpuCapabilities(std::map<MemoryMode, std::string> *memtypes) {(*memtypes)[MemoryMode::cpu] = "cpu";if (cv::ocl::haveOpenCL()) {(*memtypes)[MemoryMode::gpu] = "gpu";if (cv::ocl::Device::getDefault().hostUnifiedMemory()) {(*memtypes)[MemoryMode::shared] = "gpu with shared memory";}}
}void RunDetection(const std::vector<EdgeDetector*> &devices,const std::map<MemoryMode, std::string> &memtypes,bool show_images) {if (devices.size()) {for (auto memtype : memtypes) {std::cout << "Next run will be processed on " << memtype.second << std::endl;for (auto device : devices) {device->Setup(memtype.first);}for (auto device : devices) {device->Start(show_images);}// run the detection for given time in seconds and print status informationsPrintMetrics(devices, 5);for (auto device : devices) {device->Stop();}}}
}void FreeDevices(std::vector<EdgeDetector*> *devices) {while (devices->size()) {delete devices->back();devices->pop_back();}
}int main(int argc, char *argv[]) {/* Showing the images have a high impact on processing speed.For better comparision show_images should be disabled. */bool show_images = ((argc > 1) && argv);std::map<MemoryMode, std::string> memtypes;std::vector<EdgeDetector*> devices;// look if the gpu supports opencl and shared memoryGetGpuCapabilities(&memtypes);// find all connected camerasFindDevices(&devices);// edge detection processing on all connected camerasRunDetection(devices, memtypes, show_images);// cleanupFreeDevices(&devices);return 0;
}

工业相机通过OpenCV对图像进行边缘检测的优势

工业相机通过OpenCV进行图像边缘检测具有多重优势,包括但不限于以下几点:

  1. 丰富的算法支持:OpenCV提供了多种经典的边缘检测算法,如Sobel、Canny、Laplacian等,适用于不同场景下的边缘识别需求。这意味着工业相机可以根据特定应用选择最适合的算法,以获得最佳的边缘检测效果。

  2. 高效的实时性能:OpenCV优化了多个边缘检测算法,使其在工业相机实时处理场景下表现出色。这意味着工业相机可以快速、准确地对图像进行边缘检测,适用于实时监控、自动化检测等应用。

  3. 灵活的参数设置:OpenCV的边缘检测算法通常具有可调节的参数,如阈值、卷积核大小等,使得工程师可以根据具体场景和需求进行参数优化,以获得最佳的边缘检测结果。

  4. 跨平台性和易用性:OpenCV是一个跨平台的开源库,可以在多种操作系统上运行,并提供易于使用的API和文档。这为工业相机的开发和部署提供了便利,同时也为算法调试和优化提供了支持。

  5. 结合其他图像处理功能:OpenCV不仅提供边缘检测算法,还包含了丰富的图像处理功能,如滤波、形态学操作等。工业相机可以结合这些功能与边缘检测相互配合,实现更复杂的图像处理任务。

综上所述,工业相机通过OpenCV进行图像边缘检测具有丰富的算法支持、高效的实时性能、灵活的参数设置、跨平台性和易用性以及结合其他图像处理功能等多重优势,为工业检测和自动化生产等领域提供了强大的图像处理解决方案。

工业相机使用OpenCV对图像进行边缘检测的行业应用

工业相机使用OpenCV对图像进行边缘检测在各个行业都有广泛的应用,包括但不限于以下几个方面:

  1. 制造业:工业相机结合OpenCV的边缘检测功能可用于产品质量检测、表面缺陷检测、尺寸测量等领域。通过边缘检测,可以快速准确地识别产品表面的特征和缺陷,实现自动化的质量控制。

  2. 智能制造:在智能制造领域,工业相机通过OpenCV进行边缘检测可应用于视觉导航、自动化装配等场景,帮助机器人和自动化生产线实现精确定位和操作。

  3. 医疗影像分析:工业相机与OpenCV结合可用于医学影像的边缘特征提取和分析,辅助医生进行疾病诊断和治疗。

  4. 智能交通:在智能交通领域,工业相机通过OpenCV实现的边缘检测可用于车辆识别、行人检测、交通监控等任务,提高交通系统的智能化和安全性。

  5. 农业领域:工业相机结合OpenCV的边缘检测应用于农业领域的果蔬质量检测、病虫害检测、作物生长监测等领域。

  6. 安防监控:工业相机通过OpenCV进行边缘检测可应用于安防监控领域,如人脸识别、行为分析等,帮助提高监控系统的准确性和效率。

综上所述,工业相机使用OpenCV对图像进行边缘检测在制造业、智能制造、医疗、智能交通、农业和安防监控等多个行业领域都具有重要的应用价值,为这些领域提供了高效的图像处理和分析解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络基础面试题(二)

11.什么是网桥&#xff1f;防火墙的端口防护是指什么&#xff1f; 网桥是一种网络设备&#xff0c;用于连接两个或多个局域网&#xff08;LAN&#xff09;并转发数据包。它能够根据MAC地址来识别和转发数据&#xff0c;提高网络的传输效率和安全性。 防火墙的端口防护是指对防火…

prometheus 黑盒监控

黑盒监控 “白盒监控” 是需要把对应的Exporter程序安装到被监控的目标主机上&#xff0c;从而实现对主机各种资源以及状态的数据采集工作 ”黑盒监控“ 是不需要把Exporter程序部署到被监控的目标主机上&#xff0c;比如全球的网络质量的稳定性&#xff0c;通常用ping操作&am…

2019年认证杯SPSSPRO杯数学建模A题(第一阶段)好风凭借力,送我上青云全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 纸飞机在飞行状态下的运动模型 A题 好风凭借力&#xff0c;送我上青云 原题再现&#xff1a; 纸飞机有许多种折法。世界上有若干具有一定影响力的纸飞机比赛&#xff0c;通常的参赛规定是使用一张特定规格的纸&#xff0c;例如 A4 大小的纸张…

数据结构——队列(Queue)

目录 1.队列的介绍 2.队列工程 2.1 队列的定义 2.1.1 数组实现队列 2.1.2 单链表实现队列 2.2 队列的函数接口 2.2.1 队列的初始化 2.2.2 队列的数据插入&#xff08;入队&#xff09; 2.2.3 队列的数据删除&#xff08;出队&#xff09; 2.2.4 取队头数据 2.2.5 取队…

让车辆做到“耳听八方”,毫米波雷达芯片与系统设计

摘要: 毫米波雷达,是指工作在毫米波波段(一般为30~300GHz频域,波长1~10mm)探测的雷达。毫米波雷达体积小、质量轻、空间分辨率高,穿透“雾烟灰”的能力强,还具备全天候全天时工作的优势。在智能网联汽车体系中,毫米波雷达是系统感知层不可或缺的重要硬件,能让智能驾…

python匹配问题

脏数据匹配 一般数据建模步骤中&#xff0c;数据清洗耗时占比80%以上&#xff0c;因为现实中接触到的数据相当脏&#xff0c;无法直接简单的用pandas的merge函数解决。下面以QS大学排名的匹配为例&#xff0c;简单介绍脏数据匹配中会遇到的问题和主要步骤。 1 问题描述 给定…

Django全文搜索

Django ORM允许你执行简单的匹配操作&#xff0c;例如contains过滤器&#xff08;或者不区分大小写的icontains&#xff09;。 比如查询正文中包含django的文章 from blog.models import Post Post.objects.filter(body__containsframework) 但是如果希望执行复杂的搜索查询&…

Vue.js设计与实现阅读2

Vue.js设计与实现阅读-2 1、前言2、框架设计的核心要素2、1 提升用户体验2、2 控制代码体积2、3 Tree-Shaking2、4 特性开关2、5 错误处理 1、前言 上一篇我们了解到了 命令式和声明式的区别&#xff0c;前者关注过程&#xff0c;后者关注结果了解了虚拟dom存在的意义&#x…

WPF常用技巧-多线程处理

WPF支持单线程单元模型&#xff0c;该模型与在Windows窗体应用程序中使用的模型非常类似&#xff0c;具有以下几条原则&#xff1a; WPF元素具有线程关联性。创建WPF元素的线程拥有所创建的元素&#xff0c;其他线程不能直接与这些WPF元素进行交互。WPF对象都在类层次的某个位…

Java后端开发——SSM整合实验

文章目录 Java后端开发——SSM整合实验一、常用方式整合SSM框架二、纯注解方式整合SSM框架 Java后端开发——SSM整合实验 一、常用方式整合SSM框架 1.搭建数据库环境&#xff1a;MySQL数据库中创建一个名称为ssm的数据库&#xff0c;在该数据库中创建一个名称为tb_book的表 …

CAD数据转pcl可读数据

//-----------------------读取CAD模型------------------------vtkSmartPointer<vtkSTLReader> reader vtkSmartPointer<vtkSTLReader>::New();reader->SetFileName("data.stl");reader->Update();//----------------------转出到poly格式------…

如何顺滑使用华为云编译构建平台?

这两年平台构建服务需求越来越大&#xff0c;却一直苦于找不到一些指南&#xff0c; 这里特意写了一篇&#xff0c; 对在学习代码阶段和新手程序员朋友也蛮友好&#xff0c; 配置真的也不难&#xff0c; 也特别适合想尝试从0到1做个APP的朋友了。 以华为云的CodeArts Build为例…

CCF模拟题 202303-1田地丈量

问题描述 试题编号&#xff1a; 202303-1 试题名称&#xff1a; 田地丈量 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 512.0MB 问题描述&#xff1a; 西西艾弗岛上散落着 n 块田地。每块田地可视为平面直角坐标系下的一块矩形区域&#xff0c;由左下角坐标 (x1,y1) 和右…

OpenBLAS 的静态库命名分析 — — 以 x86_64 的静态库为例

在不同的机器上&#xff0c;生成的openblas生成的lib的名字可能是这样的&#xff1a; libopenblas_skylakexp-r0.3.26.dev.a libopenblas_skylakexp-r0.3.26.dev.so 也可能是这样的&#xff1a; liblapack_static_haswellp-r0.3.25.dev.a libopenblas_haswellp-r0.3.26.dev…

面试算法91:粉刷房子

题目 一排n幢房子要粉刷成红色、绿色和蓝色&#xff0c;不同房子被粉刷成不同颜色的成本不同。用一个n3的数组表示n幢房子分别用3种颜色粉刷的成本。要求任意相邻的两幢房子的颜色都不一样&#xff0c;请计算粉刷这n幢房子的最少成本。例如&#xff0c;粉刷3幢房子的成本分别为…

Linux-添加虚拟内存,不添加硬盘方式操作

在linux中&#xff0c;当物理内存mem不足时&#xff0c;就会使用虚拟内存(swap分区) 例如增加2G虚拟内存&#xff0c;操作如下: 1.查看内存大小 [rootlocalhost ~]# free -m 2.创建要作为swap分区的文件:增加1GB大小的交换分区&#xff0c;则命令写法如下&#xff0c;其中的cou…

1. 认识SPSS

使用的是IBM SPSS statistics 25&#xff0c;参考教材《统计分析与SPSS的应用》 一、安装和启动 具体安装过程是参考spss下载以及安装详细教程这篇文章&#xff0c;下载安装包然后按他的步骤获取用户许可证即可。 二、主要窗口 数据编辑器窗口data editor 是SPSS的主程序窗…

【C++之单例模式】

C之单例模式 前言介绍1、单例模式是什么&#xff1f;1.1 实现单例模式的三个要点1.2 单例模式分类 2. 懒汉式2.1 懒汉实现&#xff1a;基础方法2.2 懒汉实现&#xff1a;基于单锁2.3 懒汉实现&#xff1a;基于双重检测锁2.4 懒汉实现&#xff1a;基于双重检测锁和资源管理2.4.1…

ssm基于Vue的戏剧推广网站论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统戏剧推广信息管理难度大&#xff0c;容错率低&#xff0c…

代码随想录day23 二叉岁终章

669. 修剪二叉搜索树 题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新的根节点。 思考 这题有个…