Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C#)
项目场景:
Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。
Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。
Baumer相机系列中偏振相机的特殊功能有助于在一些特殊应用场合使用。
技术背景
偏光工业相机相机旨在捕捉偏光,以提高图像质量,减少各种工业应用中的眩光。
这些相机的镜头中集成了偏振滤光片,可以帮助改善图像对比度,提高色彩饱和度,并减少闪亮表面的反射。
偏光工业相机的一些关键特征可能包括高分辨率、快速帧率、适用于工业环境的坚固设计,以及与不同照明条件的兼容性。
此外,它们可能具有触发、曝光控制和图像处理能力等功能,有助于为检查和分析目的捕获清晰和详细的图像。

代码分析
Baumer工业相机堡盟相机SDK示例中020_Polarized.cpp详细介绍了如何配置相机偏振功能。
软件SDK示例地址如下所示:Baumer_GAPI_SDK_2.9.2_win_x86_64_cpp\examples\src\0_Common\020_Polarized_SinglePart\020_Polarized_SinglePart.cpp
Baumer工业相机系列中VCXU-50MP和VCXG-50MP为偏振工业相机。
| Model | Resolution | Sensor | Frame rate GigE USB3 | ||
| VCXG-50MP | 5 MP | 2448 × 2048 | Sony IMX250MZR (2/3″, 3.45 µm) | 35|24 | - |
| VCXU-50MP | 5 MP | 2448 × 2048 | Sony IMX250MZR (2/3″, 3.45 µm) | - | 77 |
该示例描述了如何使用所提供的堡盟GAPI API功能来配置相机并计算所需的偏振数据(AOL、DOP、ADOLP、Intensity)
下面的例子描述了如何从VCXU-50MP 和 VCXG-50MP 获得偏振数据。
描述了所有如何使用提供的 Baumer GAPI API 功能来配置相机和计算所需的偏振数据(AOL,DOP,ADOLP,亮度)如果需要多于一种可用的偏振数据格式,使用多部分图像进行计算会更有效。
这在示例021 _ Polalization _ MultiPart 中进行了描述
代码整体结构相对简单,在相机初始化后进行相机的偏振功能使用,下面主要描述部分核心代码如下:
/*This example describes how to obtain polarisation data from the Baumer VCXU-50MP and VCXG-50MP.The example describes all how to use the provided Baumer GAPI API functionality to configurethe camera and calculate the required polarisation data (AOL, DOP, ADOLP, Intensity)If more than one of the available polarisation data format is needed it is more efficient to usea multi-part image for the calculation. This is described in the example 021_Polarized_MultiPart.cpp
*/#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include "bgapi2_genicam/bgapi2_genicam.hpp"// handles the command line argument parsing
#include "Arguments.h"using namespace BGAPI2;//------------------------------------------------------------------------------
static double g_aopOffset = 0.0;
static bool g_bAopOffset = false;struct DeviceMatch {BGAPI2::System* pSystem;BGAPI2::Interface* pInterface;BGAPI2::Device* pDevice;
};//------------------------------------------------------------------------------
/* Read the polarization calibration matrix and angle of polarization offset from the cameraused to calculated the required polarisation data in the Baumer GAPI image processor */
static void SetDeviceCalibrationToImageProcessor(BGAPI2::Device* const pDevice, BGAPI2::ImageProcessor* const pImageProcessor);/* Setup the Baumer GAPI to calculate the requested polarization component from the rawpolarized image */
static void EnableSingleComponent(BGAPI2::Image* const pImage, const std::string sComponent);/* Get the Angle Offset from the command line parameter (if provided) and use it for the calculation */
static void argumentAopOffset(const Argument& argument, const ArgumentMode mode, const char* const pParam);/* connect to the first polarisation camera found on the system */
static int GetFirstDevice(DeviceMatch* const pMatch, bool(*pSystemFilter)(BGAPI2::System* pSystem), bool(*pInterfaceFilter)(BGAPI2::Interface* pInterface), bool(*pDeviceFilter)(BGAPI2::Device* pDevice), std::ostream& log);/* Helper to Display various information of the camera */
static void GetDeviceInfo(std::ostream& log, BGAPI2::Device* const pDevice, const bool bOpen);/* Helper to filter found cameras devices and select only polarization camera for this example */
static bool PolarizationDeviceFilter(BGAPI2::Device* const pDevice);/* Release all allocated resources */
static int ReleaseAllResources(BGAPI2::System* pSystem, BGAPI2::Interface* pInterface, BGAPI2::Device* pDevice, BGAPI2::DataStream* pDataStream, BGAPI2::ImageProcessor* pImageProcessor);//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{// Declaration of variablesBGAPI2::System* pSystem = NULL;BGAPI2::Interface* pInterface = NULL;BGAPI2::Device* pDevice = NULL;BGAPI2::ImageProcessor* pImageProcessor = NULL;BGAPI2::DataStreamList *datastreamList = NULL;BGAPI2::DataStream * pDataStream = NULL;BGAPI2::String sDataStreamID;BGAPI2::BufferList *bufferList = NULL;BGAPI2::Buffer * pBuffer = NULL;BGAPI2::String sBufferID;int returncode = 0;std::string sComponent = "ADOLP";bool bBufferedLog = true;std::cout << std::endl;std::cout << "###########################################################" << std::endl;std::cout << "# PROGRAMMER'S GUIDE Example 020_Polarized_SinglePart.cpp #" << std::endl;std::cout << "###########################################################" << std::endl;std::cout << std::endl << std::endl;static const Argument argumentList[] = {{ &sComponent, "c", "component", false, argumentString, 0, "<component>", "enable component (Intensity/AOP/DOLP/ADOLP)" },{ NULL, "o", "offsetAOP", false, argumentAopOffset, 0, "<aop offset>", "angle of polarization offset" },};parseArguments(argumentList, sizeof(argumentList) / sizeof(argumentList[0]), argc, argv);// Check if the polarisation format provided as command line parameter is a valid polarisation formattry{pImageProcessor = new BGAPI2::ImageProcessor();// Create dummy image to check if requested component is availablechar dummyBuffer[1];BGAPI2::Image* pImage = pImageProcessor->CreateImage(1, 1, "BaumerPolarized8", dummyBuffer, sizeof(dummyBuffer));BGAPI2::Node* pComponentSelector = pImage->GetNode("ComponentSelector");pComponentSelector->SetValue(sComponent.c_str());pImage->Release();}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;std::cout << std::endl << "Component '" << sComponent << "' not supported" << std::endl;std::cout << std::endl << "Supported Formats are Intensity, AOP, DOP and ADOLP" << std::endl;std::cout << std::endl << "End" << std::endl << "Input any number to close the program:";int endKey = 0;std::cin >> endKey;ReleaseAllResources(pSystem, pInterface, pDevice, pDataStream, pImageProcessor);return returncode;}// Find and open the first polarisation cameraDeviceMatch match = { NULL, NULL, NULL };std::stringstream bufferedLog;const int code = GetFirstDevice(&match, NULL, NULL, PolarizationDeviceFilter, bBufferedLog ? bufferedLog : std::cout);pSystem = match.pSystem;pInterface = match.pInterface;pDevice = match.pDevice;if ((code != 0) || (pDevice == NULL)){// Error or no device foundif (bBufferedLog != false){// Display full device searchstd::cout << bufferedLog.str();}returncode = (returncode == 0) ? code : returncode;if (returncode == 0){std::cout << " No Polarized Device found " << sDataStreamID << std::endl;}std::cout << std::endl << "End" << std::endl << "Input any number to close the program:";int endKey = 0;std::cin >> endKey;ReleaseAllResources(pSystem, pInterface, pDevice, pDataStream, pImageProcessor);return returncode;}GetDeviceInfo(std::cout, pDevice, false);/* Determine the polarized pixel format for processingAs the camera sends the raw polarized data as a Mono8/10/12 pixelformat we need to pick thecorresponding Baumer polarized pixelformat depending on the camera setting for thecalculation of the polarized image.*/std::string sPixelFormatRaw = "";try {BGAPI2::String sPixelFormat = pDevice->GetRemoteNode("PixelFormat")->GetValue();if (sPixelFormat == "Mono8"){sPixelFormatRaw = "BaumerPolarized8";}else if (sPixelFormat == "Mono10"){sPixelFormatRaw = "BaumerPolarized10";}else if (sPixelFormat == "Mono12"){sPixelFormatRaw = "BaumerPolarized12";}else if (sPixelFormat == "Mono12p"){sPixelFormatRaw = "BaumerPolarized12p";}else{std::cout << " Pixel format not supported" << sDataStreamID << std::endl;}}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}if (sPixelFormatRaw == ""){returncode = (returncode == 0) ? 1 : returncode;std::cout << std::endl << "End" << std::endl << "Input any number to close the program:";int endKey = 0;std::cin >> endKey;ReleaseAllResources(pSystem, pInterface, pDevice, pDataStream, pImageProcessor);return returncode;}std::cout << "DEVICE PARAMETER SETUP" << std::endl;std::cout << "######################" << std::endl << std::endl;// Set angle of polarization offset to device, if command line parameter passedif (g_bAopOffset){try{BGAPI2::Node* const pAngleOfPolarizationOffset = pDevice->GetRemoteNode("CalibrationAngleOfPolarizationOffset");pAngleOfPolarizationOffset->SetDouble(g_aopOffset);std::cout << " AngleOfPolarizationOffset: " << pAngleOfPolarizationOffset->GetValue() << std::endl;}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}}try{// Set trigger mode to off (FreeRun)pDevice->GetRemoteNode("TriggerMode")->SetString("Off");std::cout << " TriggerMode: " << pDevice->GetRemoteNode("TriggerMode")->GetValue() << std::endl;std::cout << std::endl;}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}std::cout << "IMAGE PROCESSOR SETUP" << std::endl;std::cout << "#####################" << std::endl << std::endl;// Configure the Image Processor to use the calibration values from the camera devicetry{SetDeviceCalibrationToImageProcessor(pDevice, pImageProcessor);}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}std::cout << std::endl << std::endl;std::cout << "DATA STREAM LIST" << std::endl;std::cout << "################" << std::endl << std::endl;try{// Get information for all available data streamsdatastreamList = pDevice->GetDataStreams();datastreamList->Refresh();std::cout << "5.1.8 Detected datastreams: " << datastreamList->size() << std::endl;for (DataStreamList::iterator dstIterator = datastreamList->begin(); dstIterator != datastreamList->end(); dstIterator++){std::cout << " 5.2.4 DataStream ID: " << dstIterator->first << std::endl << std::endl;}}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}std::cout << "DATA STREAM" << std::endl;std::cout << "###########" << std::endl << std::endl;// Open the first datastreamtry{for (DataStreamList::iterator dstIterator = datastreamList->begin(); dstIterator != datastreamList->end(); dstIterator++){std::cout << "5.1.9 Open first datastream " << std::endl;std::cout << " DataStream ID: " << dstIterator->first << std::endl << std::endl;dstIterator->second->Open();sDataStreamID = dstIterator->first;std::cout << " Opened datastream - NodeList Information " << std::endl;std::cout << " StreamAnnounceBufferMinimum: " << dstIterator->second->GetNode("StreamAnnounceBufferMinimum")->GetValue() << std::endl;if( dstIterator->second->GetTLType() == "GEV" ){std::cout << " StreamDriverModel: " << dstIterator->second->GetNode("StreamDriverModel")->GetValue() << std::endl;}std::cout << " " << std::endl;break;}}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}if (sDataStreamID == ""){std::cout << " No DataStream found " << sDataStreamID << std::endl;std::cout << std::endl << "End" << std::endl << "Input any number to close the program:";int endKey = 0;std::cin >> endKey;ReleaseAllResources(pSystem, pInterface, pDevice, pDataStream, pImageProcessor);return returncode;}else{pDataStream = (*datastreamList)[sDataStreamID];}std::cout << "BUFFER LIST" << std::endl;std::cout << "###########" << std::endl << std::endl;try{// get the BufferListbufferList = pDataStream->GetBufferList();// allocate 4 buffers using internal buffer modefor(int i = 0; i < 4; i++){pBuffer = new BGAPI2::Buffer();bufferList->Add(pBuffer);}std::cout << "5.1.10 Announced buffers: " << bufferList->GetAnnouncedCount() << " using " << pBuffer->GetMemSize() * bufferList->GetAnnouncedCount() << " [bytes]" << std::endl;}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}try{for (BufferList::iterator bufIterator = bufferList->begin(); bufIterator != bufferList->end(); bufIterator++){bufIterator->second->QueueBuffer();}std::cout << "5.1.11 Queued buffers: " << bufferList->GetQueuedCount() << std::endl;}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}std::cout << " " << std::endl;std::cout << "CAMERA START" << std::endl;std::cout << "############" << std::endl << std::endl;// Start DataStream acquisitiontry{pDataStream->StartAcquisitionContinuous();std::cout << "5.1.12 DataStream started " << std::endl;}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}// Start aquisition from camera devicetry{std::cout << "5.1.12 " << pDevice->GetModel() << " started " << std::endl;pDevice->GetRemoteNode("AcquisitionStart")->Execute();}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}// Capture 12 imagesstd::cout << " " << std::endl;std::cout << "CAPTURE 12 IMAGES BY IMAGE POLLING" << std::endl;std::cout << "##################################" << std::endl << std::endl;// Create the image object to store the calculated polarisation dataBGAPI2::Image* pImagePolarized = NULL;try{// Set to true to save result of the first captured image as a Baumer RAW imagebool bSaveBrw = true;for (int i = 0; i < 12; i++){BGAPI2::Buffer* pBufferFilled = pDataStream->GetFilledBuffer(1000); // timeout 1000 msecif (pBufferFilled == NULL){std::cout << "Error: Buffer Timeout after 1000 msec" << std::endl;}else{try{if (pBufferFilled->GetIsIncomplete() == true){std::cout << "Error: Image is incomplete" << std::endl;}else if (pBufferFilled->GetImagePresent() != true){std::cout << "Error: Image not present" << std::endl;}else{// get information about the image from the buffer objectbo_uint width = static_cast<bo_uint>(pBufferFilled->GetWidth());bo_uint height = static_cast<bo_uint>(pBufferFilled->GetHeight());void* pBufferData = pBufferFilled->GetMemPtr();bo_uint64 bufferDataSize = pBufferFilled->GetMemSize();bo_uint64 imageOffset = pBufferFilled->GetImageOffset();bo_uint64 imageDataSize = (bufferDataSize > imageOffset) ? (bufferDataSize - imageOffset) : 0;void* pImageData = reinterpret_cast<char*>(pBufferData) + imageOffset;std::cout << " Image " << std::setw(5) << pBufferFilled->GetFrameID() << " received in memory address " << std::hex << pBufferData << std::dec << std::endl;/* For the first image, a new image object is created, all further images reuse the object andtherefore just initialize it with new data */if (pImagePolarized == NULL){pImagePolarized = pImageProcessor->CreateImage(width, height, sPixelFormatRaw.c_str(), pImageData, imageDataSize);// Enable the component to be calculated, disable all othersEnableSingleComponent(pImagePolarized, sComponent);}else{pImagePolarized->Init(width, height, sPixelFormatRaw.c_str(), pImageData, imageDataSize);/* As the pixel format is the same for all images captured, the enabled components and the active component selectorare preserved, so you don't need to enable components on every image. */}// Calculate the required Polarisation format using a direct transformation from raw polarized image.BGAPI2::Image* pComponent = pImageProcessor->CreateTransformedImage(pImagePolarized, (sComponent != "ADOLP") ? "Mono8" : "RGB8");std::cout << " component image: " << pComponent->GetNode("ComponentSelector")->GetValue().get() << std::endl;if (bSaveBrw) {std::string sFilename = sComponent + ".brw";pComponent->GetNode("SaveBrw")->SetValue(sFilename.c_str());}pComponent->Release();bSaveBrw = false;}}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}}if (pBufferFilled){// Queue buffer againpBufferFilled->QueueBuffer();}}}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}std::cout << " " << std::endl;if (pImagePolarized){try{pImagePolarized->Release();}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}}std::cout << "CAMERA STOP" << std::endl;std::cout << "###########" << std::endl << std::endl;// Stop the cameratry{if (pDevice->GetRemoteNodeList()->GetNodePresent("AcquisitionAbort")){pDevice->GetRemoteNode("AcquisitionAbort")->Execute();std::cout << "5.1.12 " << pDevice->GetModel() << " aborted " << std::endl;}pDevice->GetRemoteNode("AcquisitionStop")->Execute();std::cout << "5.1.12 " << pDevice->GetModel() << " stopped " << std::endl;std::cout << std::endl;BGAPI2::String sExposureNodeName = "";if (pDevice->GetRemoteNodeList()->GetNodePresent("ExposureTime")){sExposureNodeName = "ExposureTime";}else if (pDevice->GetRemoteNodeList()->GetNodePresent("ExposureTimeAbs")){sExposureNodeName = "ExposureTimeAbs";}std::cout << " ExposureTime: " << std::fixed << std::setprecision(0) << pDevice->GetRemoteNode(sExposureNodeName)->GetDouble() << " [" << pDevice->GetRemoteNode(sExposureNodeName)->GetUnit() << "]" << std::endl;if (pDevice->GetTLType() == "GEV"){if(pDevice->GetRemoteNodeList()->GetNodePresent("DeviceStreamChannelPacketSize"))std::cout << " DeviceStreamChannelPacketSize: " << pDevice->GetRemoteNode("DeviceStreamChannelPacketSize")->GetInt() << " [bytes]" << std::endl;elsestd::cout << " GevSCPSPacketSize: " << pDevice->GetRemoteNode("GevSCPSPacketSize")->GetInt() << " [bytes]" << std::endl;std::cout << " GevSCPD (PacketDelay): " << pDevice->GetRemoteNode("GevSCPD")->GetInt() << " [tics]" << std::endl;}std::cout << std::endl;}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}// Stop DataStream acquisitiontry{if (pDataStream->GetTLType() == "GEV"){// DataStream Statisticstd::cout << " DataStream Statistics " << std::endl;std::cout << " DataBlockComplete: " << pDataStream->GetNodeList()->GetNode("DataBlockComplete")->GetInt() << std::endl;std::cout << " DataBlockInComplete: " << pDataStream->GetNodeList()->GetNode("DataBlockInComplete")->GetInt() << std::endl;std::cout << " DataBlockMissing: " << pDataStream->GetNodeList()->GetNode("DataBlockMissing")->GetInt() << std::endl;std::cout << " PacketResendRequestSingle: " << pDataStream->GetNodeList()->GetNode("PacketResendRequestSingle")->GetInt() << std::endl;std::cout << " PacketResendRequestRange: " << pDataStream->GetNodeList()->GetNode("PacketResendRequestRange")->GetInt() << std::endl;std::cout << " PacketResendReceive: " << pDataStream->GetNodeList()->GetNode("PacketResendReceive")->GetInt() << std::endl;std::cout << " DataBlockDroppedBufferUnderrun: " << pDataStream->GetNodeList()->GetNode("DataBlockDroppedBufferUnderrun")->GetInt() << std::endl;std::cout << " Bitrate: " << pDataStream->GetNodeList()->GetNode("Bitrate")->GetDouble() << std::endl;std::cout << " Throughput: " << pDataStream->GetNodeList()->GetNode("Throughput")->GetDouble() << std::endl;std::cout << std::endl;}if (pDataStream->GetTLType() == "U3V"){// DataStream Statisticstd::cout << " DataStream Statistics " << std::endl;std::cout << " GoodFrames: " << pDataStream->GetNodeList()->GetNode("GoodFrames")->GetInt() << std::endl;std::cout << " CorruptedFrames: " << pDataStream->GetNodeList()->GetNode("CorruptedFrames")->GetInt() << std::endl;std::cout << " LostFrames: " << pDataStream->GetNodeList()->GetNode("LostFrames")->GetInt() << std::endl;std::cout << std::endl;}// BufferList Informationstd::cout << " BufferList Information " << std::endl;std::cout << " DeliveredCount: " << bufferList->GetDeliveredCount() << std::endl;std::cout << " UnderrunCount: " << bufferList->GetUnderrunCount() << std::endl;std::cout << std::endl;pDataStream->StopAcquisition();std::cout << "5.1.12 DataStream stopped " << std::endl;bufferList->DiscardAllBuffers();}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}std::cout << std::endl;std::cout << "RELEASE" << std::endl;std::cout << "#######" << std::endl << std::endl;// Release buffersstd::cout << "5.1.13 Releasing the resources " << std::endl;try{while (bufferList->size() > 0){pBuffer = bufferList->begin()->second;bufferList->RevokeBuffer(pBuffer);delete pBuffer;}std::cout << " buffers after revoke: " << bufferList->size() << std::endl;ReleaseAllResources(pSystem, pInterface, pDevice, pDataStream, pImageProcessor);}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;}std::cout << std::endl;std::cout << "End" << std::endl << std::endl;std::cout << "Input any number to close the program:";int endKey = 0;std::cin >> endKey;return returncode;
}//------------------------------------------------------------------------------
/* Setup the Baumer GAPI to calculate the requested polarization component from the rawpolarized image */
void EnableSingleComponent(BGAPI2::Image* const pImage, const std::string sComponent)
{BGAPI2::Node* pComponentSelector = pImage->GetNode("ComponentSelector");BGAPI2::Node* pComponentEnable = pImage->GetNode("ComponentEnable");BGAPI2::NodeMap*pComponents = pComponentSelector->GetEnumNodeList();const bo_uint64 componentsAvailable = pComponents->GetNodeCount();for (bo_uint64 i = 0; i < componentsAvailable; i++) {pComponentSelector->SetInt(i);pComponentEnable->SetBool(sComponent == pComponentSelector->GetValue().get());}
}//------------------------------------------------------------------------------
/* Read the polarization calibration matrix and angle of polarization offset from the cameraused to calculated the required polarisation data in the Baumer GAPI image processor */
void SetDeviceCalibrationToImageProcessor(BGAPI2::Device* const pDevice, BGAPI2::ImageProcessor* const pImageProcessor)
{struct CalibrationEntry {const char* pSelector;unsigned int row;unsigned int col;};static const CalibrationEntry calibrationEntry[] = {{ "Gain00", 0, 0 },{ "Gain01", 0, 1 },{ "Gain02", 0, 2 },{ "Gain03", 0, 3 },{ "Gain10", 1, 0 },{ "Gain11", 1, 1 },{ "Gain12", 1, 2 },{ "Gain13", 1, 3 },{ "Gain20", 2, 0 },{ "Gain21", 2, 1 },{ "Gain22", 2, 2 },{ "Gain23", 2, 3 },};BGAPI2::NodeMap* const pDeviceMap = pDevice->GetRemoteNodeList();BGAPI2::Node* pDeviceCalibrationMatrixValueSelector = pDeviceMap->GetNode("CalibrationMatrixValueSelector");BGAPI2::Node* pDeviceCalibrationMatrixValue = pDeviceMap->GetNode("CalibrationMatrixValue");BGAPI2::Node* pCalibrationMatrixRowSelector = pImageProcessor->GetNode("CalibrationMatrixRowSelector");BGAPI2::Node* pCalibrationMatrixColSelector = pImageProcessor->GetNode("CalibrationMatrixColumnSelector");BGAPI2::Node* pCalibrationMatrixValue = pImageProcessor->GetNode("CalibrationMatrixValue");const std::streamsize precision = std::cout.precision(5);const std::ios_base::fmtflags flags = std::cout.flags();std::cout.setf(std::ios_base::fixed | std::ios_base::right);// Set calibration matrix from device to image processorfor (unsigned int i = 0; i < sizeof(calibrationEntry) / sizeof(calibrationEntry[0]); i++){pDeviceCalibrationMatrixValueSelector->SetValue(calibrationEntry[i].pSelector);double value = pDeviceCalibrationMatrixValue->GetDouble();std::cout << " CalibrationMatrix " << calibrationEntry[i].pSelector << ": "<< std::setw(8) << value << std::endl;pCalibrationMatrixRowSelector->SetInt(calibrationEntry[i].row);pCalibrationMatrixColSelector->SetInt(calibrationEntry[i].col);pCalibrationMatrixValue->SetDouble(value);}std::cout.precision(2);// Set angle of polarisation offset from device to image processorconst double aopOffset = pDeviceMap->GetNode("CalibrationAngleOfPolarizationOffset")->GetDouble();std::cout << " CalibrationAngleOfPolarizationOffset: " << std::setw(6) << aopOffset << std::endl << std::endl;pImageProcessor->GetNode("CalibrationAngleOfPolarizationOffset")->SetDouble(aopOffset);std::cout.precision(precision);std::cout.flags(flags);
}//------------------------------------------------------------------------------
/* Get the Angle Offset from the command line parameter (if provided) and use it for the calculation */
void argumentAopOffset(const Argument& argument, const ArgumentMode mode, const char* const pParam)
{if (mode == eArgumentInit){g_aopOffset = 0.0;g_bAopOffset = false;}else{double value = 0.0;
#if _WIN32if ((pParam != NULL) && (sscanf_s(pParam, "%lf", &value) == 1))
#elseif ((pParam != NULL) && (sscanf(pParam, "%lf", &value) == 1))
#endif{g_aopOffset = value;g_bAopOffset = true;}}
}//------------------------------------------------------------------------------
/* Helper to filter found cameras devices and select only polarization camera for this example */
bool PolarizationDeviceFilter(BGAPI2::Device* const pDevice)
{if (pDevice->GetRemoteNodeList()->GetNodePresent("ComponentSelector")){if (pDevice->GetRemoteNode("ComponentSelector")->GetValue() == "PolarizedRaw"){return true;}}return false;
}//------------------------------------------------------------------------------
int GetFirstDevice(DeviceMatch* const pMatch, bool(*pSystemFilter)(BGAPI2::System* pSystem), bool(*pInterfaceFilter)(BGAPI2::Interface* pInterface), bool(*pDeviceFilter)(BGAPI2::Device* pDevice), std::ostream& log)
{int returncode = 0;log << "SYSTEM LIST" << std::endl;log << "###########" << std::endl << std::endl;try {BGAPI2::SystemList* pSystemList = SystemList::GetInstance();// Counting available systems (TL producers)pSystemList->Refresh();log << "5.1.2 Detected systems: " << pSystemList->size() << std::endl;// System device informationfor (SystemList::iterator sysIterator = pSystemList->begin(); sysIterator != pSystemList->end(); sysIterator++){BGAPI2::System* const pSystem = sysIterator->second;log << " 5.2.1 System Name: " << pSystem->GetFileName() << std::endl;log << " System Type: " << pSystem->GetTLType() << std::endl;log << " System Version: " << pSystem->GetVersion() << std::endl;log << " System PathName: " << pSystem->GetPathName() << std::endl << std::endl;}for (SystemList::iterator sysIterator = pSystemList->begin(); sysIterator != pSystemList->end(); sysIterator++){log << "SYSTEM" << std::endl;log << "######" << std::endl << std::endl;BGAPI2::System* const pSystem = sysIterator->second;pMatch->pSystem = pSystem;try{pSystem->Open();log << "5.1.3 Open next system " << std::endl;log << " 5.2.1 System Name: " << pSystem->GetFileName() << std::endl;log << " System Type: " << pSystem->GetTLType() << std::endl;log << " System Version: " << pSystem->GetVersion() << std::endl;log << " System PathName: " << pSystem->GetPathName() << std::endl << std::endl;log << " Opened system - NodeList Information " << std::endl;log << " GenTL Version: " << pSystem->GetNode("GenTLVersionMajor")->GetValue() << "." << pSystem->GetNode("GenTLVersionMinor")->GetValue() << std::endl << std::endl;const char* pCloseSystemReason = "???";if ((pSystemFilter != NULL) && (pSystemFilter(pSystem) == false)){pCloseSystemReason = "skipped";}else{log << "INTERFACE LIST" << std::endl;log << "##############" << std::endl << std::endl;try{BGAPI2::InterfaceList* pInterfaceList = pSystem->GetInterfaces();// Count available interfacespInterfaceList->Refresh(100); // timeout of 100 mseclog << "5.1.4 Detected interfaces: " << pInterfaceList->size() << std::endl;// Interface informationfor (InterfaceList::iterator ifIterator = pInterfaceList->begin(); ifIterator != pInterfaceList->end(); ifIterator++){BGAPI2::Interface* const pInterface = ifIterator->second;log << " 5.2.2 Interface ID: " << ifIterator->first << std::endl;log << " Interface Type: " << pInterface->GetTLType() << std::endl;log << " Interface Name: " << pInterface->GetDisplayName() << std::endl << std::endl;}log << "INTERFACE" << std::endl;log << "#########" << std::endl << std::endl;for (InterfaceList::iterator ifIterator = pInterfaceList->begin(); ifIterator != pInterfaceList->end(); ifIterator++){try{// Open the next interface in the listBGAPI2::Interface* const pInterface = ifIterator->second;pMatch->pInterface = pInterface;log << "5.1.5 Open interface " << std::endl;log << " 5.2.2 Interface ID: " << ifIterator->first << std::endl;log << " Interface Type: " << pInterface->GetTLType() << std::endl;log << " Interface Name: " << pInterface->GetDisplayName() << std::endl;pInterface->Open();const char* pReason = "???";if ((pInterfaceFilter != NULL) && (pInterfaceFilter(pInterface) == false)){pReason = "skipped";}else{// Search for any camera is connected to this interfaceBGAPI2::DeviceList* const pDeviceList = pInterface->GetDevices();pDeviceList->Refresh(100);if (pDeviceList->size() == 0){pReason = "no camera found";}else{log << " " << std::endl;log << " Opened interface - NodeList Information " << std::endl;if (pInterface->GetTLType() == "GEV"){log << " GevInterfaceSubnetIPAddress: " << pInterface->GetNode("GevInterfaceSubnetIPAddress")->GetValue() << std::endl;log << " GevInterfaceSubnetMask: " << pInterface->GetNode("GevInterfaceSubnetMask")->GetValue() << std::endl;}if (pInterface->GetTLType() == "U3V"){// log << " NodeListCount: " << pInterface->GetNodeList()->GetNodeCount() << std::endl;}// Open the first matching camera in the listtry{// Counting available cameraslog << "5.1.6 Detected devices: " << pDeviceList->size() << std::endl;// Device information before openingfor (DeviceList::iterator devIterator = pDeviceList->begin(); devIterator != pDeviceList->end(); devIterator++){BGAPI2::Device* const pDevice = devIterator->second;log << " 5.2.3 Device DeviceID: " << pDevice->GetID() << std::endl;log << " Device Model: " << pDevice->GetModel() << std::endl;log << " Device SerialNumber: " << pDevice->GetSerialNumber() << std::endl;log << " Device Vendor: " << pDevice->GetVendor() << std::endl;log << " Device TLType: " << pDevice->GetTLType() << std::endl;log << " Device AccessStatus: " << pDevice->GetAccessStatus() << std::endl;log << " Device UserID: " << pDevice->GetDisplayName() << std::endl << std::endl;}for (DeviceList::iterator devIterator = pDeviceList->begin(); devIterator != pDeviceList->end(); devIterator++){try{BGAPI2::Device* const pDevice = devIterator->second;pMatch->pDevice = pDevice;GetDeviceInfo(log, pDevice, true);if ((pDeviceFilter == NULL) || (pDeviceFilter(pDevice) == true)){return returncode;}log << " Close device (skipped) " << std::endl << std::endl;pDevice->Close();pMatch->pDevice = NULL;}catch (BGAPI2::Exceptions::ResourceInUseException& ex){returncode = (returncode == 0) ? 1 : returncode;log << " Device " << devIterator->first << " already opened " << std::endl;log << " ResourceInUseException: " << ex.GetErrorDescription() << std::endl;}catch (BGAPI2::Exceptions::AccessDeniedException& ex){returncode = (returncode == 0) ? 1 : returncode;log << " Device " << devIterator->first << " already opened " << std::endl;log << " AccessDeniedException " << ex.GetErrorDescription() << std::endl;}}}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;log << "ExceptionType: " << ex.GetType() << std::endl;log << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;log << "in function: " << ex.GetFunctionName() << std::endl;}pReason = "no camera match";}}log << "5.1.13 Close interface (" << pReason << ") " << std::endl << std::endl;pInterface->Close();pMatch->pInterface = NULL;}catch (BGAPI2::Exceptions::ResourceInUseException& ex){returncode = (returncode == 0) ? 1 : returncode;log << " Interface " << ifIterator->first << " already opened " << std::endl;log << " ResourceInUseException: " << ex.GetErrorDescription() << std::endl;}}}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;log << "ExceptionType: " << ex.GetType() << std::endl;log << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;log << "in function: " << ex.GetFunctionName() << std::endl;}pCloseSystemReason = "no camera match";}log << " Close system (" << pCloseSystemReason << ") " << std::endl << std::endl;pSystem->Close();pMatch->pSystem = NULL;}catch (BGAPI2::Exceptions::ResourceInUseException& ex){returncode = (returncode == 0) ? 1 : returncode;log << " System " << sysIterator->first << " already opened " << std::endl;log << " ResourceInUseException: " << ex.GetErrorDescription() << std::endl;}}}catch (BGAPI2::Exceptions::IException& ex){returncode = (returncode == 0) ? 1 : returncode;log << "ExceptionType: " << ex.GetType() << std::endl;log << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;log << "in function: " << ex.GetFunctionName() << std::endl;}return returncode;
}//------------------------------------------------------------------------------
/* Helper to Display various information of the camera */
void GetDeviceInfo(std::ostream& log, BGAPI2::Device* const pDevice, const bool bOpen)
{log << "5.1.7 Open device " << std::endl;log << " Device DeviceID: " << pDevice->GetID() << std::endl;log << " Device Model: " << pDevice->GetModel() << std::endl;log << " Device SerialNumber: " << pDevice->GetSerialNumber() << std::endl;log << " Device Vendor: " << pDevice->GetVendor() << std::endl;log << " Device TLType: " << pDevice->GetTLType() << std::endl;log << " Device AccessStatus: " << pDevice->GetAccessStatus() << std::endl;log << " Device UserID: " << pDevice->GetDisplayName() << std::endl << std::endl;if (bOpen)pDevice->Open();log << " Opened device - RemoteNodeList Information " << std::endl;log << " Device AccessStatus: " << pDevice->GetAccessStatus() << std::endl;BGAPI2::NodeMap* const pRemoteNodeList = pDevice->GetRemoteNodeList();// Serial numberif (pRemoteNodeList->GetNodePresent("DeviceSerialNumber"))log << " DeviceSerialNumber: " << pRemoteNodeList->GetNode("DeviceSerialNumber")->GetValue() << std::endl;else if (pRemoteNodeList->GetNodePresent("DeviceID"))log << " DeviceID (SN): " << pRemoteNodeList->GetNode("DeviceID")->GetValue() << std::endl;elselog << " SerialNumber: Not Available " << std::endl;// Display DeviceManufacturerInfoif (pRemoteNodeList->GetNodePresent("DeviceManufacturerInfo"))log << " DeviceManufacturerInfo: " << pRemoteNodeList->GetNode("DeviceManufacturerInfo")->GetValue() << std::endl;// Display DeviceFirmwareVersion or DeviceVersionif (pRemoteNodeList->GetNodePresent("DeviceFirmwareVersion"))log << " DeviceFirmwareVersion: " << pRemoteNodeList->GetNode("DeviceFirmwareVersion")->GetValue() << std::endl;else if (pRemoteNodeList->GetNodePresent("DeviceVersion"))log << " DeviceVersion: " << pRemoteNodeList->GetNode("DeviceVersion")->GetValue() << std::endl;elselog << " DeviceVersion: Not Available " << std::endl;if (pDevice->GetTLType() == "GEV") {log << " GevCCP: " << pRemoteNodeList->GetNode("GevCCP")->GetValue() << std::endl;log << " GevCurrentIPAddress: " << pRemoteNodeList->GetNode("GevCurrentIPAddress")->GetValue() << std::endl;log << " GevCurrentSubnetMask: " << pRemoteNodeList->GetNode("GevCurrentSubnetMask")->GetValue() << std::endl;}log << std::endl;
}//------------------------------------------------------------------------------
/* Release all allocated resources */
int ReleaseAllResources(BGAPI2::System* pSystem, BGAPI2::Interface* pInterface, BGAPI2::Device* pDevice, BGAPI2::DataStream* pDataStream, BGAPI2::ImageProcessor* pImageProcessor)
{try{if (pDataStream)pDataStream->Close();if (pImageProcessor){delete pImageProcessor;}if (pDevice){pDevice->Close();}if (pInterface){pInterface->Close();}if (pSystem){pSystem->Close();}BGAPI2::SystemList::ReleaseInstance();}catch (BGAPI2::Exceptions::IException& ex){std::cout << "ExceptionType: " << ex.GetType() << std::endl;std::cout << "ErrorDescription: " << ex.GetErrorDescription() << std::endl;std::cout << "in function: " << ex.GetFunctionName() << std::endl;return 1;}return 0;
}
偏振功能的优点
1、减少闪亮或光亮表面的眩光和反射,提高对比度以更好地检测缺陷或表面特征,并加强颜色区分。
2、它们还可以帮助提高汽车、电子和制造业等行业的自动检测和质量控制过程的准确性和速度。
3、偏振照相机在户外应用中很有用,因为那里有大量的阳光或大气雾霾,否则可能会干扰图像的清晰度。
偏振工业相机相对于普通工业相机的优势
偏光工业相机与普通工业相机相比有几个优点。
1、它们使用偏振滤光片来捕捉在单一方向上振动的光波,减少眩光和闪亮表面的反射。这导致了更清晰和更精确的图像,使其更容易识别高反射表面的缺陷或异常情况。
2、偏光相机还提供更好的对比度和颜色精度,允许精确的颜色测量和分析。
3、偏光相机可以在恶劣的环境条件下使用,并能捕捉到普通相机难以看到的物体的图像。
Baumer偏振相机的行业应用
偏光工业相机通常用于各种工业应用,如质量控制、缺陷检查、材料分析和表面检查。
它们有助于消除眩光和反射,提高玻璃、塑料、金属等各种材料的图像对比度和准确性。
偏光工业相机在检测隐藏的缺陷或污染物、识别材料中的应力点和检查隐藏结构方面也很有用。它们通常用于汽车、航空航天、电子和制造业等行业。
下面简单介绍几个能体现出偏振特性的行业应用:
相关文章:
Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C#)
项目场景: Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外࿰…...
无损以太网与网络拥塞管理(PFC、ECN)
无损以太网 无损以太网(Lossless Ethernet)是一种专门用于数据中心网络的网络技术,旨在提供低延迟、高吞吐量和可靠性的传输服务。它是在传统以太网的基础上进行了扩展,引入了新的拥塞管理机制,以避免数据包丢失和网络…...
爬虫大全:从零开始学习爬虫的基础知识
爬虫是一种自动获取网站信息的技术,它可以帮助我们快速地抓取海量网站数据,进行统计分析、挖掘和展示。本文旨在为初学者详细介绍爬虫的基础知识,包括:爬虫原理、爬虫分类、网页结构分析、爬虫工具和技能、爬虫实践示范࿰…...
【Python】【进阶篇】21、Django Admin数据表可视化
目录 21、Django Admin数据表可视化1. 创建超级用户2. 将Model注册到管理后台1)在admin.py文件中声明 3. django_admin_log数据表 21、Django Admin数据表可视化 在《Django Admin后台管理系统》介绍过 Django 的后台管理系统是为了方便站点管理人员对数据表进行操作。Django …...
【MySQL约束】数据管理实用指南
1、数据库约束的认识 数据库约束的概念:数据库的约束是关系型数据库的一个重要的功能,它提供了一种“校验数据”合法性的机制,能够保证数据的“完整性”、“准确性”和“正确性” 数据库的约束: not null:不能存储 nul…...
2023年第二十届五一数学建模竞赛C题:“双碳”目标下低碳建筑研究-思路详解与代码答案
该题对于模型的考察难度较低,难度在于数据的搜集以及选取与处理。 这里推荐数据查询的网站:中国碳核算数据库(CEADs) https://www.ceads.net.cn/ 国家数据 国家数据data.stats.gov.cn/easyquery.htm?cnC01 以及各省市《统…...
Vue父组件生命周期和子组件生命周期触发顺序
加载渲染过程 父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted子组件更新过程 父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated父组件更新…...
DevOps工程师 - 面试手册
DevOps工程师 - 面试手册 岗位概述 DevOps工程师是一种专注于提高软件开发和运维团队协作、提高软件产品交付速度和质量的职位。这种角色要求具备跨领域的知识,以便在开发和运维过程中建立起稳定、可靠的基础设施和自动化流程。 常见的职位招聘描述 负责设计、实…...
Netty内存管理--内存池空间规格化SizeClasses
一、规格化 内存池类似于一个内存零售商, 从操作系统中申请一整块内存, 然后对其进行合理分割, 将分割后的小内存返回给程序。这里存在3个尺寸: 分割尺寸: 底层内存管理的基本单位, 比如常见的以页为单位分配, 但是页的大小是灵活的;申请尺寸: 内存使用者希望申请到的内存大小…...
数据结构刷题(三十):96不同的二叉搜索树、01背包问题理论、416分割等和子集
一、96. 不同的二叉搜索树 1.这个题比较难想递推公式, dp[3],就是元素1为头结点搜索树的数量 元素2为头结点BFS的数量 元素3为头结点BFS的数量 元素1为头结点搜索树的数量 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量 元素2为头结…...
bash的进程与欢迎讯息自定义
在bash shell中,可以通过多种方式自定义欢迎讯息和提示符。主要有: 修改/etc/profile文件: 该文件在用户登录后执行,定义了PROMPT_COMMAND和PS1提示符。可以修改其内容实现自定义欢迎讯息和提示符。 例如,修改为: bash PROMPT_COMMANDecho -e "\nWelcome to My Bash She…...
本周大新闻|苹果首款MR没有主打卖点;Meta认为AI是AR OS的基础
本周XR大新闻,AR方面,苹果首款MR或没有主打卖点,反而尽可能支持更多App和服务;扎克伯格表示基于AI的AR眼镜操作系统是下一代计算平台的基础;微软芯片工程VP Jean Boufarhat加入Meta芯片团队;Humane展示了…...
Java中工具类Arrays、Collections、Objects
Arrays Arrays是Java中提供的一个针对数组操作的工具类,所有的方法都是静态的。 大致有这些常用的方法 sort()针对常用的基本数据类型,都能进行排序,byte、char、int、long、float、doubleparallelSort()并行排序,多线程排序&am…...
Docker安装Nginx/Python/Golang/Vscode【亲测可用】
一、docker安装nginx docker安装nginx,安装的是最新版本的:docker pull nginx:latest 创建一个容器:docker run --name my-nginx -p 80:80 -d nginx:latest 开启一个交互模式终端:docker exec -it my-nginx bash 创建django项…...
蓝桥杯2022年第十三届决赛真题-最大数字
蓝桥杯2022年第十三届决赛真题-最大数字 时间限制: 3s 内存限制: 320MB 题目描述 给定一个正整数 N。你可以对 N 的任意一位数字执行任意次以下 2 种操作: 将该位数字加 1。如果该位数字已经是 9,加 1 之后变成 0。 将该位数字减 1。如果该位数字已经…...
smbms项目搭建
目录 1.搭建一个maven web项目 2.配置Tomcat 3.测试项目是否能够跑起来 4.导入项目中会遇到的Jar包 5.项目结构搭建 6.项目实体类搭建 7.编写基础公共类 1.数据库配置文件 2.编写数据库的公共类 3.编写字符编码过滤器 3.1web配置注册 4.导入静态资源 1.搭建一个maven web项目 …...
进程/线程 状态模型详解
前言:最近操作系统复习到线程的状态模型(也可以说进程的状态模型,本文直接用线程来说)时候,网上查阅资料,发现很多文章都说的很不一样,有五状态模型、六状态模型、七状态模型.......虽然都是对的…...
数据结构与算法之队列: Leetcode 621. 任务调度器 (Typescript版)
任务调度器 https://leetcode.cn/problems/task-scheduler/ 描述 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间&#…...
【报错】arXiv上传文章出现XXX.sty not found
笔者在overleaf上编译文章一切正常,但上传文章到arxiv时出现类似于如下报错: 一般情况下观察arxiv的编译log,不通过的原因,很多时候都是由于某一行导入了啥package,引起的报错;但是如果没有任何一个具体的…...
项目合同管理
项目合同管理的基本概念及分类、项目合同签订、项目合同管理以及项目合同索赔处理等内容 信息系统工程的建设过程实际上就是合同的执行和监控的过程 1、项目合同的概念及分类 合同法律关系:权力和义务关系 合同可以是书面形式、口头形式和其他形式 书面形式是指…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
