Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C++)

2023-11-04 08:30

本文主要是介绍Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C++),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目场景:

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

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

Baumer相机系列中偏振相机的特殊功能有助于在一些特殊应用场合使用。


技术背景

偏光工业相机相机旨在捕捉偏光,以提高图像质量,减少各种工业应用中的眩光。

这些相机的镜头中集成了偏振滤光片,可以帮助改善图像对比度,提高色彩饱和度,并减少闪亮表面的反射。

偏光工业相机的一些关键特征可能包括高分辨率、快速帧率、适用于工业环境的坚固设计,以及与不同照明条件的兼容性。

此外,它们可能具有触发、曝光控制和图像处理能力等功能,有助于为检查和分析目的捕获清晰和详细的图像。

  

  


代码分析

Baumer工业相机堡盟相机SDK示例中020_Polarized.cpp详细介绍了如何配置相机偏振功能。

软件SDK示例地址如下所示:Baumer_GAPI_SDK_2.12.0_win_x86_64_cpp\examples\src\0_Common\020_Polarized\020_Polarized.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)

代码整体结构相对简单,在相机初始化后进行相机的偏振功能使用,部分核心代码如下: 

std::cout << std::endl;
std::cout << "POLARIZER CONFIGURATION" << std::endl;
std::cout << "#######################" << std::endl << std::endl;try {// Enable or disable interpolationpolarizer.EnableInterpolation(enableInterpolation);std::cout << "Interpolation " << (enableInterpolation ? "on" : "off") << std::endl;// Configure the polarizer to use the calibration values from the camera devicepolarizer.ReadCalibrationData(pDevice);
}
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;
}// Enable requested polarisation formats and create image containers
try {for (std::set<std::string>::const_iterator component = sComponents.begin();component != sComponents.end(); component++) {std::map<std::string, BGAPI2::Polarizer::Formats>::const_iterator c = supportedComponents.find(*component);if (c == supportedComponents.end()) {std::cout << *component << ":" << " not supported" << std::endl;returncode = (returncode == 0) ? 1 : returncode;} else if (requestedComponents.find(c->second) == requestedComponents.end()) {polarizer.Enable(c->second, true);std::cout << *component << ":" << " enabled" << std::endl;requestedComponents.insert(std::pair<BGAPI2::Polarizer::Formats, BGAPI2::Image*>(c->second, imgProc.CreateImage()));}}
}
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 (returncode) {ReleaseAllResources(pSystem, pInterface, pDevice, pDataStream, &requestedComponents);return returncode;
}

下面是几个偏振相机常使用的函数方法代码:

void GetSupportedComponents(BGAPI2::Polarizer* const polarizer,const bool is_color,std::string* const help) {BGAPI2::Polarizer::formatlist list;for (BGAPI2::Polarizer::formatlist::const_iterator it = list.begin(); it != list.end(); it++) {if (BGAPI2::Polarizer::IsFormatAvailable(*it, is_color)) {std::string componentName = polarizer->GetFormatString(*it).get();supportedComponents.insert(std::pair<std::string, BGAPI2::Polarizer::Formats>(componentName, *it));if (help->length() > 0) {*help += "/";}*help += componentName;}}
}// Get the required components from the command line argument
void argumentComponent(const Argument& /*argument*/, const ArgumentMode mode, const char* const pParam) {static bool bClearComponents = true;if (mode == eArgumentInit) {sComponents.clear();const char* components[] = { "Intensity", "AOP", "DOLP", "POL", "UNPOL", "ADOLP" };for (unsigned int i = 0; i < sizeof(components) / sizeof(components[0]); i++) {if (supportedComponents.find(components[i]) != supportedComponents.end()) {sComponents.insert(components[i]);}}bClearComponents = true;} else {if (bClearComponents) {sComponents.clear();bClearComponents = false;}if (pParam != NULL) {if (sComponents.find(pParam) == sComponents.end()) {sComponents.insert(pParam);}}}
}// 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;int ret_value = 0;
#if defined(_WIN32)ret_value = sscanf_s(pParam, "%lf", &value);
#elseret_value = sscanf(pParam, "%lf", &value);
#endifif ((pParam != NULL) && (ret_value == 1)) {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) {return BGAPI2::Polarizer::IsPolarized(pDevice, NULL);
}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 = BGAPI2::SystemList::GetInstance();// Counting available systems (TL producers)pSystemList->Refresh();*log << "5.1.2   Detected systems:  " << pSystemList->size() << std::endl;// System device informationfor (BGAPI2::SystemList::iterator sysIterator = pSystemList->begin();sysIterator != pSystemList->end();sysIterator++) {BGAPI2::System* const pSystem = *sysIterator;*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 (BGAPI2::SystemList::iterator sysIterator = pSystemList->begin();sysIterator != pSystemList->end();sysIterator++) {*log << "SYSTEM" << std::endl;*log << "######" << std::endl << std::endl;BGAPI2::System* const pSystem = *sysIterator;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 msec*log << "5.1.4   Detected interfaces: " << pInterfaceList->size() << std::endl;// Interface informationfor (BGAPI2::InterfaceList::iterator ifIterator = pInterfaceList->begin();ifIterator != pInterfaceList->end();ifIterator++) {BGAPI2::Interface* const pInterface = *ifIterator;*log << "  5.2.2   Interface ID:      " << pInterface->GetID() << 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 (BGAPI2::InterfaceList::iterator ifIterator = pInterfaceList->begin();ifIterator != pInterfaceList->end();ifIterator++) {try {// Open the next interface in the listBGAPI2::Interface* const pInterface = *ifIterator;pMatch->pInterface = pInterface;*log << "5.1.5   Open interface " << std::endl;*log << "  5.2.2   Interface ID:      " << pInterface->GetID() << 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 cameras*log << "5.1.6   Detected devices:         "<< pDeviceList->size() << std::endl;// Device information before openingfor (BGAPI2::DeviceList::iterator devIterator = pDeviceList->begin();devIterator != pDeviceList->end();devIterator++) {BGAPI2::Device* const pDevice = *devIterator;*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 (BGAPI2::DeviceList::iterator devIterator = pDeviceList->begin();devIterator != pDeviceList->end();devIterator++) {try {BGAPI2::Device* const pDevice = *devIterator;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->GetID() << " already opened "<< std::endl;*log << " ResourceInUseException: " << ex.GetErrorDescription()<< std::endl;}catch (BGAPI2::Exceptions::AccessDeniedException& ex) {returncode = (returncode == 0) ? 1 : returncode;*log << " Device  " << devIterator->GetID() << " 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->GetID() << " 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->GetID() << " 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;} else {*log << "          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;} else {*log << "          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,std::map<BGAPI2::Polarizer::Formats, BGAPI2::Image*>* requestedComponents) {try {if (pDataStream) {pDataStream->Close();}if (pDevice) {pDevice->Close();}if (pInterface) {pInterface->Close();}if (pSystem) {pSystem->Close();}BGAPI2::SystemList::ReleaseInstance();for (std::map<BGAPI2::Polarizer::Formats, BGAPI2::Image*>::iterator it = requestedComponents->begin();it != requestedComponents->end(); it++) {if (it->second != NULL) {it->second->Release();it->second = NULL;}}requestedComponents->clear();}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++)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/344517

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in