Baumer工业相机堡盟工业相机如何使用BGAPISDK和OpenCV生成视频(C++)

简介: Baumer工业相机堡盟工业相机如何使用BGAPISDK和OpenCV生成视频(C++)

Baumer工业相机


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


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


Baumer工业相机由于其性能和质量的优越和稳定,常用于高速同步采集领域,通常使用各种图像算法来提高其捕获的图像的质量。


Baumer工业相机BGAPISDK生成视频的技术背景


Baumer工业相机的BGAPI SDK是Baumer公司开发的针对其相机产品系列的一套软件开发工具包。该SDK提供了一组API,使开发人员可以编写专业应用程序,从而控制、捕获、处理和显示Baumer相机的图像和数据。BGAPI SDK支持多种编程语言,包括C++、C#、Visual Basic、LabVIEW、Matlab等,并提供了大量示例代码和文档,以帮助用户轻松上手,快速完成应用程序的开发。


BGAPI SDK提供了丰富的功能,可以控制Baumer相机的所有参数,包括曝光时间、增益、白平衡、触发模式等,以及支持各种数据格式,例如Raw、BMP、JPG等,同时还提供了实时显示、数据采集、图像处理等功能,为开发人员提供了高度定制化的解决方案。此外,BGAPI SDK还支持多相机系统的开发,并可支持各种计算机操作系统,如Windows、Linux、Mac OS等。


Baumer工业相机通过SDK生成视频功能的技术背景主要涉及到图像处理和视频生成两个核心环节。


在图像处理方面,Baumer工业相机使用OpenCV库进行图像处理。OpenCV是一款开源的计算机视觉和机器学习软件库,包含了众多算法和函数,可以实现对图像的读取、预处理、特征提取、目标检测等功能。Baumer工业相机通过引用OpenCV库,实现了对图像的高效处理和解析。


在视频生成方面,Baumer工业相机通过GAPISDK(Baumer公司自主研发的软件开发套件)实现了对图像数据的进一步处理和生成视频。GAPISDK针对Baumer工业相机的特点和性能进行了优化,可以更好地利用相机的硬件资源,提高处理速度和效率。同时,GAPISDK还提供了丰富的API接口和函数库,可以方便地进行二次开发和定制,满足不同用户的需求。


通过引用OpenCV库和GAPISDK,Baumer工业相机实现了对图像的高效处理和生成视频的功能。这不仅提高了工业生产中的图像处理效率,也进一步推动了工业自动化和智能化的发展。


本文介绍的通过集成BGAPI SDK进行生成视频的功能。


Baumer工业相机通过BGAPISDK循环查找相机序列功能


下面介绍在C++里Baumer工业相机如何通过BGAPISDK循环查找相机序列功能方式


1.引用合适的类文件


代码如下(示例):

/* Copyright 2019-2020 Baumer Optronic */
#include <stdio.h>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <set>
#include <vector>
#include <algorithm>
#include <string>
#include <functional>
// This example shows how to convert a set of images (in alphabetical order) into a video file using the openCV
// library. If no command line parameters are given the example will generate a set of images in the folder
// 'ExampleImages' (if not empty the images will be used) and create a video file 'ExampleVideo.avi' from this
// images
// openCV must be available!!!
// Command Line Parameters
//
// --imgDir: sets the directory where source images are located, if not set, the default 'ExampleImages' will be used
// Important: All image files need to have the same dimension for the video creation to be successful
// Tip: You can use the  Baumer CameraExplorer Image Recorder functionality to record some example images
//
// --videoFile: sets the output file name for the created video, if not, the default 'ExampleVideo.avi' will be used
const std::string gc_sImageDirDefault = "ExampleImages";
const std::string gc_sVideoFileNameDefault = "ExampleVideo.avi";
#if defined(_WIN32)
#   include <direct.h>
#else
#   include <sys/stat.h>
#endif
#include "Arguments.h"
#include "HelperFunctions.h"
#define EXAMPLE_IMAGES 1
#if defined(_WIN32)
static const char c_cPathSeparator = '\\';
#else
static const char c_cPathSeparator = '/';
#endif


如下为CMakeLists里代码:

cmake_minimum_required(VERSION 3.10)
message(STATUS "## ${CMAKE_CURRENT_BINARY_DIR} ##")
get_filename_component(EXAMPLE_NAME "${CMAKE_CURRENT_BINARY_DIR}" NAME)
string(SUBSTRING ${EXAMPLE_NAME} 0 3 TARGET_NAME)
project(${EXAMPLE_NAME})
set(SOURCE_FILES 
    ${EXAMPLE_NAME}.cpp
    ${SHARED_DIR}/Arguments.cpp
    ${SHARED_DIR}/Arguments.h
    ${SHARED_DIR}/HelperFunctions.cpp
    ${SHARED_DIR}/HelperFunctions.h
    UserTemplate.user
)
include_directories(${SHARED_DIR})
# =================== Add openCV support! ==============================
if(ENABLE_OPENCV)
    message(STATUS "\n======================= Configure OpenCV library =======================")
    set(BUILD_SHARED_LIBS OFF)
    find_package(OpenCV QUIET COMPONENTS core highgui imgproc)  # some packages in OpenCV obsolete ?!?
    if(OpenCV_FOUND)
        message(STATUS "OpenCV Version: '${OpenCV_VERSION}'")
        message(STATUS "OpenCV LibDir:  '${OpenCV_LIB_PATH}'")
        if(OpenCV_VERSION_MAJOR GREATER "2")
            add_definitions(-DUSE_OCL_COMPONENT=3)
            find_package(OpenCV COMPONENTS videoio imgcodecs)
            if(NOT OpenCV_FOUND)
                message(STATUS "OpenCV has no Video support!")
            endif()
        elseif (OpenCV_VERSION_MAJOR LESS "2")
            option(ENABLE_OPENCV "Enable OpenCV Support in SDK example" OFF)
            option(OpenCV_FOUND "OpenCV Found" OFF)
            message(STATUS "OpenCV with Version 1.x not supported!")
        else()  # OpenCV Version 2.x
            find_package(OpenCV COMPONENTS ocl)  # this package in OpenCV obsolete ?!?
        endif()
    else()
        message(STATUS "OpenCV not supported!")
    endif()
    if(OpenCV_FOUND AND ENABLE_OPENCV)
        add_definitions(-DUSE_OPENCV=1)
        list(APPEND INCLUDE_DIR ${OpenCV_INCLUDE_DIRS})
        message(STATUS "OpenCV Libs:  '${OpenCV_LIBS}'")
    else()
        message(STATUS "This means program '${PROJECT_NAME}' couldn't run properly!")
        message(STATUS "Please set the correct search path for the OpenCV package and/or use OpenCV > 3.0!")
        message(STATUS "=====================================================================\n")
    endif()
endif()
message(STATUS "## OpenCV is configured: ${PROJECT_NAME}! ##\n")
message(STATUS "=====================================================================\n")
add_executable(${TARGET_NAME} ${SOURCE_FILES})
if(OpenCV_FOUND)
    target_link_libraries(${TARGET_NAME} "${OpenCV_LIBS}")
endif()
set_property(TARGET ${TARGET_NAME} PROPERTY PROJECT_LABEL ${PROJECT_NAME})
set_property(TARGET ${TARGET_NAME} PROPERTY OUTPUT_NAME ${PROJECT_NAME})
if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
    if(OpenCV_FOUND AND OpenCV_SHARED)
        get_target_property(OpenCV_DLL_DEBUG   opencv_world IMPORTED_LOCATION_DEBUG)
        get_target_property(OpenCV_DLL_RELEASE opencv_world  IMPORTED_LOCATION_RELEASE)
        set(OpenCV_WorldLib  "$<$<CONFIG:debug>:${OpenCV_DLL_DEBUG}>$<$<CONFIG:release>:${OpenCV_DLL_RELEASE}>")
        add_custom_command(TARGET ${TARGET_NAME} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OpenCV_WorldLib}"  $<TARGET_FILE_DIR:${TARGET_NAME}>
            COMMENT "copy OpenCV library to output directory")
    endif()
    set(USER_FILE ${TARGET_NAME}.vcxproj.user)
    configure_file(UserTemplate.user ${USER_FILE} @ONLY)
endif()


2.通过BGAPISDK生成视频的功能


Baumer工业相机通过BGAPI SDK生成视频核心代码如下所示:

// ---------------------------------------------------------------------------------------------------------------------
// Here you can use argument parameters for sImgDirectory and sVideoFileName!
int main(int argc, char* argv[]) {
    std::string sImgDirectory;
    std::string sVideoFileName;
    static const Argument argumentList[] = {
        { &sImgDirectory,    "p", "imgPath",   false   , argumentString,     0, "Pathname",     "Image Path" },
        { &sVideoFileName,   "v", "videoFile", false   , argumentString,     0, "Filename", "Video File Name" },
    };
    parseArguments(argumentList, (sizeof(argumentList)/sizeof(argumentList[0])), argc, argv);
    int iReturnCode = 0;
    try {
        std::cout << std::endl;
        std::string sExampleName = __FILE__;
        sExampleName = sExampleName.substr(sExampleName.find_last_of(c_cPathSeparator) + 1);
        writeHeader1(sExampleName);
        writeHeader1("EXAMPLE VIDEO FROM IMAGE DIRECTORY");
// The flag USE_OPENCV is set by the CMake run, CMake tries to find OpenCV >= Version 2
#if USE_OPENCV  // OpenCV
// The flag USE_OCL_COMPONENT is set by the CMake run if OpenCV can use OpenCL to speed up it's functionality
#   if USE_OCL_COMPONENT
        if (cv::ocl::haveOpenCL()) {
            cv::ocl::Context context;
            if (!context.create(cv::ocl::Device::TYPE_GPU)) {
                // FAIL: no context
            } else {
                std::cout << "OpenCL available!" << std::endl;
                for (size_t i = 0; i < context.ndevices(); i++) {
                    cv::ocl::Device clDevice = context.device(i);
                    std::cout << clDevice.vendorName() << std::endl;
                    std::cout << clDevice.driverVersion() << std::endl << std::endl;
                }
            }
        }
#   endif  // USE_OCL_COMPONENT
        stringvec fileList;
        std::string imgDir;
        if (!sImgDirectory.empty()) {
            imgDir = sImgDirectory;
        } else {
            imgDir = gc_sImageDirDefault;
            std::cout << "Using default setting for 'imgPath': " << imgDir << std::endl;
            // Create the directory below the execution dir
#if defined(_WIN32)
            _mkdir(imgDir.c_str());
#else
            mkdir(imgDir.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
#endif
        }
#ifdef WITH_REGEX
        readDirectory(imgDir, ".*.jpg", &fileList);
#else
        readDirectory(imgDir, "*.jpg", &fileList);
#endif
        size_t slashPos = imgDir.find_last_of("/\\");
        std::string exampleDir = imgDir;
        if (slashPos < std::string::npos)
            exampleDir = imgDir.substr(slashPos+1);
        if (fileList.empty() && (exampleDir == gc_sImageDirDefault)) {
            // Create some images if the image directory identical with the default
            std::cout << "Here were be some test images with changing colors created!" << std::endl;
            createExampleImages(imgDir, cv::Size(1000, 500));
            readDirectory(imgDir, ".*.jpg", &fileList);
        }
        // If the fileList is empty, exit the program:
        if (fileList.empty()) {
            std::cout << "No Image(s) found!" << std::endl;
            return 102;
        }
        std::sort(fileList.begin(), fileList.end(), std::less<std::string>());
        // Now there are some pictures in the list - and you can create a video file from this
        cv::Mat frame = cv::imread(imgDir + "/" + fileList.at(0));
        cv::Size frameSize = cv::Size(frame.cols, frame.rows);
        int frames_per_second = 10;
        // Create and initialize the VideoWriter object:
        // std::string sVideoFileName;
        if (sVideoFileName.empty()) {
            sVideoFileName = gc_sVideoFileNameDefault;
            std::cout << "Using default setting for 'videoFile': " << sVideoFileName << std::endl;
        }
#ifdef CV_FOURCC_MACRO
        cv::VideoWriter oVideoWriter(sVideoFileName,
            CV_FOURCC('M', 'J', 'P', 'G'),  // cv::VideoWriter::fourcc
            frames_per_second, frameSize, true);
#else
        cv::VideoWriter oVideoWriter(sVideoFileName,
            cv::VideoWriter::fourcc('M', 'J', 'P', 'G'),
            frames_per_second, frameSize, true);
#endif
        // If the VideoWriter object is not initialized successfully, exit the program:
        if (oVideoWriter.isOpened() == false) {
            std::cout << "Cannot save the video to a file" << std::endl;
            return 103;
        }
        // ... and now write all pictures in the video file
        int iNumber = 0;
        for (std::string filename : fileList) {
            std::cout << "file" << (++iNumber) << ": " << filename << std::endl;
            cv::Mat frame2 = cv::imread(imgDir + "/" + filename);
            if (!frame2.empty())  // use valid picture only!
                oVideoWriter.write(frame2);
        }
        oVideoWriter.release();
#else  // USE_OPENCV
        // If we could not find OpenCV this text will be displayed.
        std::cout << "Without OpenCV we cannot create the video in this example!" << std::endl;
        std::cout << "Availability is checked while CMake creates this project." << std::endl;
        std::cout << "Please install OpenCV (version 2.3 or later) or set 'OpenCV_DIR' to the" << std::endl;
        std::cout << "correct path in the CMakeTests.txt script or as a variable in your environment" << std::endl;
        std::cout << "and run CMake again. " << std::endl;
        std::cout << "######################################" << std::endl << std::endl;
#endif  // USE_OPENCV
        std::cout << std::endl;
        std::cout << "End" << std::endl << std::endl;
    }
    catch (const std::exception& e) {
        iReturnCode = (iReturnCode == 0) ? 1 : iReturnCode;
        std::cout << "unhandled std exception: '" << e.what() << "'" << std::endl;
    }
    catch (...) {
        iReturnCode = (iReturnCode == 0) ? 1 : iReturnCode;
        std::cout << "unhandled exception" << std::endl;
    }
    if (iReturnCode != 0)
        std::cout << "Example ends with error: " << iReturnCode << std::endl;
    std::cout << "Press ENTER to close the program!" << std::endl;
    int endKey = std::cin.get();
    endKey = endKey;  // unused variable
    return iReturnCode;
}


Baumer工业相机使用GAPISDK生成视频功能的优势


工业相机使用GAPISDK生成视频功能的优势主要包括:


  1. 高效率:使用GAPISDK生成视频功能可以大大提高工业相机的数据传输和处理效率。相比传统的相机数据传输方式,使用GAPISDK可以更好地优化数据传输流程,减少数据冗余和传输时间,从而提高整体的处理效率。
  2. 高质量:GAPISDK针对图像处理进行了深度优化,可以更好地处理图像数据,提高图像质量。使用GAPISDK生成的视频可以更好地保持原始图像的清晰度和色彩,从而提高视频的质量。
  3. 实时性:使用GAPISDK生成视频功能可以保证数据的实时性。通过优化数据传输和处理流程,GAPISDK可以更好地保证数据传输的实时性和处理的及时性,从而满足工业生产中对实时性的要求。
  4. 可扩展性:GAPISDK是一个开放性的软件开发套件,可以方便地与其他工业相机和控制软件集成。这使得工业相机在使用GAPISDK生成视频功能时具有更好的可扩展性,可以根据实际需求进行定制和扩展。
  5. 灵活性:GAPISDK提供了丰富的API接口和函数库,可以方便地进行二次开发和定制。这使得工业相机在使用GAPISDK生成视频功能时具有更高的灵活性,可以根据实际需求进行灵活的定制和控制。


总之,工业相机使用GAPISDK生成视频功能具有高效率、高质量、实时性、可扩展性和灵活性等优势,可以更好地满足工业生产中对图像处理和视频生成的需求。


Baumer工业相机使用GAPISDK生成视频的行业应用


Baumer工业相机使用GAPISDK生成视频的行业应用非常广泛,主要包括:


  1. 汽车制造:在汽车制造过程中,Baumer工业相机可以用于拍摄零部件的图像,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、尺寸测量、缺陷检测等任务。这可以提高生产效率和质量。
  2. 电子制造:在电子制造领域,Baumer工业相机可以用于识别和检测电子元器件的外观和位置,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、质量检测和分类等任务。这可以提高生产流程的效率和品质。
  3. 食品加工:在食品加工行业中,Baumer工业相机可以用于拍摄食品的图像,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、品质检测和分类等任务。这可以提高生产流程的效率和品质。
  4. 物流仓储:在物流仓储领域,Baumer工业相机可以用于拍摄货物的图像,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、识别和跟踪等任务。这可以实现自动化仓库管理和智能物流配送等目标。
  5. 医疗影像:在医疗影像领域,Baumer工业相机可以用于拍摄医学影像,如X光片、CT扫描和MRI等,并通过GAPISDK将拍摄的图像数据转换成视频,以进行进一步的图像处理、分析和诊断等任务。这可以提高医疗诊断的准确性和效率。


总之,Baumer工业相机使用GAPISDK生成视频的行业应用非常广泛,涉及到制造业、物流业、医疗行业等多个领域。随着工业自动化和智能化的发展,其应用前景也将越来越广阔。


目录
相关文章
|
3月前
|
计算机视觉 索引
OpenCV4学习笔记(2):显示相机视频流的帧率
这篇文章是OpenCV4学习笔记的第二部分,介绍了如何通过OpenCV4在显示相机视频流时计算并显示其帧率,使用`getTickCount`和`getTickFrequency`函数来测量帧时间,并用`putText`在图像上绘制帧率信息。
OpenCV4学习笔记(2):显示相机视频流的帧率
|
3月前
|
算法框架/工具 C++ Python
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角 或 旋转矩阵与欧拉角(Euler Angles)之间的相互转换,以及python和C++代码实现
223 0
|
1月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
255 3
|
5月前
|
算法 开发工具 计算机视觉
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
【零代码研发】OpenCV实验大师工作流引擎C++ SDK演示
77 1
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
61 11
|
3月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
2月前
|
存储 计算机视觉 C++
在C++中实现Armadillo库与OpenCV库之间的数据格式转换
在C++中实现Armadillo库与OpenCV库之间的数据格式转换是一项常见且实用的技能。上述步骤提供了一种标准的方法来进行这种转换,可以帮助开发者在两个库之间高效地转移和处理数据。虽然转换过程相对直接,但开发者应留意数据类型匹配和性能优化等关键细节。
25 3
|
3月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
484 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
4天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
22 4
|
6天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
18 4