feat:测试连接海康摄像头

master
邱棚 2026-04-10 21:02:24 +08:00
parent 81e4ff45ec
commit ec19ed39ae
1 changed files with 173 additions and 87 deletions

View File

@ -5,6 +5,7 @@
#include <cstring> #include <cstring>
#include <chrono> #include <chrono>
#include <thread> #include <thread>
#include <vector>
#include "MvCamera.h" #include "MvCamera.h"
@ -73,6 +74,174 @@ static void PrintDeviceInfo(const MV_CC_DEVICE_INFO* pInfo, unsigned int index)
std::cout << std::endl; std::cout << std::endl;
} }
static int ConfigureGamma(CMvCamera& camera, float gamma)
{
// Some models expose GammaEnable; if unsupported, continue and try setting Gamma directly.
int nRet = camera.SetBoolValue("GammaEnable", true);
if (MV_OK != nRet)
{
std::cerr << "Warning: Set GammaEnable failed: " << ToHex(nRet) << std::endl;
}
nRet = camera.SetFloatValue("Gamma", gamma);
if (MV_OK != nRet)
{
std::cerr << "Set Gamma failed: " << ToHex(nRet) << std::endl;
return nRet;
}
std::cout << "Gamma configured: " << gamma << std::endl;
return MV_OK;
}
static bool SaveFrameToBmp(CMvCamera& camera, const MV_FRAME_OUT& stFrame, const std::string& outFile)
{
MV_SAVE_IMAGE_PARAM_EX3 stSaveParam;
std::memset(&stSaveParam, 0, sizeof(stSaveParam));
stSaveParam.enImageType = MV_Image_Bmp;
stSaveParam.enPixelType = stFrame.stFrameInfo.enPixelType;
stSaveParam.nWidth = stFrame.stFrameInfo.nWidth;
stSaveParam.nHeight = stFrame.stFrameInfo.nHeight;
stSaveParam.nDataLen = stFrame.stFrameInfo.nFrameLen;
stSaveParam.pData = stFrame.pBufAddr;
stSaveParam.iMethodValue = 0;
stSaveParam.nJpgQuality = 90;
const unsigned int maxImageLen =
stFrame.stFrameInfo.nWidth * stFrame.stFrameInfo.nHeight * 4 + 2048;
std::vector<unsigned char> imageBuffer(maxImageLen, 0);
stSaveParam.pImageBuffer = imageBuffer.data();
stSaveParam.nBufferSize = maxImageLen;
int nRet = camera.SaveImage(&stSaveParam);
if (MV_OK != nRet)
{
std::cerr << "SaveImage failed: " << ToHex(nRet) << std::endl;
return false;
}
FILE* fp = std::fopen(outFile.c_str(), "wb");
if (fp == nullptr)
{
std::cerr << "Open output file failed: " << outFile << std::endl;
return false;
}
const size_t writeBytes = std::fwrite(imageBuffer.data(), 1, stSaveParam.nImageLen, fp);
std::fclose(fp);
if (writeBytes != stSaveParam.nImageLen)
{
std::cerr << "Write output file failed: " << outFile << std::endl;
return false;
}
std::cout << "Image saved: " << outFile
<< ", bytes=" << stSaveParam.nImageLen << std::endl;
return true;
}
[[maybe_unused]] static int CaptureOneFrameContinuousAndSave(CMvCamera& camera, const std::string& outFile)
{
int nRet = camera.SetEnumValueByString("TriggerMode", "Off");
if (MV_OK != nRet)
{
std::cerr << "Set TriggerMode Off failed: " << ToHex(nRet) << std::endl;
return nRet;
}
nRet = camera.StartGrabbing();
if (MV_OK != nRet)
{
std::cerr << "StartGrabbing failed: " << ToHex(nRet) << std::endl;
return nRet;
}
// 连续模式通常会先等一会儿,让数据流稳定。
std::this_thread::sleep_for(std::chrono::milliseconds(200));
MV_FRAME_OUT stFrame = {};
nRet = camera.GetImageBuffer(&stFrame, 3000);
if (MV_OK != nRet)
{
std::cerr << "GetImageBuffer failed: " << ToHex(nRet) << std::endl;
camera.StopGrabbing();
return nRet;
}
PrintFrameStructInfo();
PrintRawBytes(&stFrame, sizeof(MV_FRAME_OUT), "stFrame");
std::cout << "Grab success:"
<< " width=" << stFrame.stFrameInfo.nWidth
<< " height=" << stFrame.stFrameInfo.nHeight
<< " frameLen=" << stFrame.stFrameInfo.nFrameLen
<< " pixelType=0x" << std::hex << std::uppercase
<< static_cast<unsigned int>(stFrame.stFrameInfo.enPixelType)
<< std::dec << std::endl;
const bool saveOk = SaveFrameToBmp(camera, stFrame, outFile);
camera.FreeImageBuffer(&stFrame);
camera.StopGrabbing();
return saveOk ? MV_OK : -1;
}
static int CaptureOneFrameSoftwareTriggerAndSave(CMvCamera& camera, const std::string& outFile)
{
int nRet = camera.SetEnumValueByString("TriggerMode", "On");
if (MV_OK != nRet)
{
std::cerr << "Set TriggerMode On failed: " << ToHex(nRet) << std::endl;
return nRet;
}
nRet = camera.SetEnumValueByString("TriggerSource", "Software");
if (MV_OK != nRet)
{
std::cerr << "Set TriggerSource Software failed: " << ToHex(nRet) << std::endl;
return nRet;
}
nRet = camera.StartGrabbing();
if (MV_OK != nRet)
{
std::cerr << "StartGrabbing failed: " << ToHex(nRet) << std::endl;
return nRet;
}
nRet = camera.CommandExecute("TriggerSoftware");
if (MV_OK != nRet)
{
std::cerr << "TriggerSoftware failed: " << ToHex(nRet) << std::endl;
camera.StopGrabbing();
return nRet;
}
MV_FRAME_OUT stFrame = {};
nRet = camera.GetImageBuffer(&stFrame, 3000);
if (MV_OK != nRet)
{
std::cerr << "GetImageBuffer failed: " << ToHex(nRet) << std::endl;
camera.StopGrabbing();
return nRet;
}
PrintFrameStructInfo();
PrintRawBytes(&stFrame, sizeof(MV_FRAME_OUT), "stFrame");
std::cout << "Grab success:"
<< " width=" << stFrame.stFrameInfo.nWidth
<< " height=" << stFrame.stFrameInfo.nHeight
<< " frameLen=" << stFrame.stFrameInfo.nFrameLen
<< " pixelType=0x" << std::hex << std::uppercase
<< static_cast<unsigned int>(stFrame.stFrameInfo.enPixelType)
<< std::dec << std::endl;
const bool saveOk = SaveFrameToBmp(camera, stFrame, outFile);
camera.FreeImageBuffer(&stFrame);
camera.StopGrabbing();
return saveOk ? MV_OK : -1;
}
int main() int main()
{ {
@ -140,107 +309,24 @@ int main()
} }
} }
// 连续采集模式 nRet = ConfigureGamma(camera, 0.6f);
nRet = camera.SetEnumValueByString("TriggerMode", "Off");
if (MV_OK != nRet) if (MV_OK != nRet)
{ {
std::cerr << "Set TriggerMode Off failed: " << ToHex(nRet) << std::endl;
camera.Close();
CMvCamera::FinalizeSDK();
return 1;
}
nRet = camera.StartGrabbing();
if (MV_OK != nRet)
{
std::cerr << "StartGrabbing failed: " << ToHex(nRet) << std::endl;
camera.Close();
CMvCamera::FinalizeSDK();
return 1;
}
// 稍等一会儿,让流稳定一点
std::this_thread::sleep_for(std::chrono::milliseconds(200));
MV_FRAME_OUT stFrame = {};
nRet = camera.GetImageBuffer(&stFrame, 3000);
if (MV_OK != nRet)
{
std::cerr << "GetImageBuffer failed: " << ToHex(nRet) << std::endl;
camera.StopGrabbing();
camera.Close();
CMvCamera::FinalizeSDK();
return 1;
}
PrintFrameStructInfo();
PrintRawBytes(&stFrame, sizeof(MV_FRAME_OUT), "stFrame");
std::cout << "Grab success:"
<< " width=" << stFrame.stFrameInfo.nWidth
<< " height=" << stFrame.stFrameInfo.nHeight
<< " frameLen=" << stFrame.stFrameInfo.nFrameLen
<< " pixelType=0x" << std::hex << std::uppercase
<< static_cast<unsigned int>(stFrame.stFrameInfo.enPixelType)
<< std::dec << std::endl;
// 保存为 bmp/jpg 都可以
MV_SAVE_IMAGE_PARAM_EX3 stSaveParam;
std::memset(&stSaveParam, 0, sizeof(stSaveParam));
stSaveParam.enImageType = MV_Image_Bmp; // 也可改为 MV_Image_Jpeg
stSaveParam.enPixelType = stFrame.stFrameInfo.enPixelType;
stSaveParam.nWidth = stFrame.stFrameInfo.nWidth;
stSaveParam.nHeight = stFrame.stFrameInfo.nHeight;
stSaveParam.nDataLen = stFrame.stFrameInfo.nFrameLen;
stSaveParam.pData = stFrame.pBufAddr;
stSaveParam.iMethodValue = 0;
stSaveParam.nJpgQuality = 90;
const unsigned int maxImageLen =
stFrame.stFrameInfo.nWidth * stFrame.stFrameInfo.nHeight * 4 + 2048;
unsigned char* pImageBuffer = new unsigned char[maxImageLen];
std::memset(pImageBuffer, 0, maxImageLen);
stSaveParam.pImageBuffer = pImageBuffer;
stSaveParam.nBufferSize = maxImageLen;
nRet = camera.SaveImage(&stSaveParam);
if (MV_OK != nRet)
{
std::cerr << "SaveImage failed: " << ToHex(nRet) << std::endl;
delete[] pImageBuffer;
camera.FreeImageBuffer(&stFrame);
camera.StopGrabbing();
camera.Close(); camera.Close();
CMvCamera::FinalizeSDK(); CMvCamera::FinalizeSDK();
return 1; return 1;
} }
// 保留连续采集路径,同时 main 默认走软件触发单帧采集。
const std::string outFile = "grab_result.bmp"; const std::string outFile = "grab_result.bmp";
FILE* fp = std::fopen(outFile.c_str(), "wb"); nRet = CaptureOneFrameSoftwareTriggerAndSave(camera, outFile);
if (fp == nullptr) if (MV_OK != nRet)
{ {
std::cerr << "Open output file failed: " << outFile << std::endl;
delete[] pImageBuffer;
camera.FreeImageBuffer(&stFrame);
camera.StopGrabbing();
camera.Close(); camera.Close();
CMvCamera::FinalizeSDK(); CMvCamera::FinalizeSDK();
return 1; return 1;
} }
std::fwrite(pImageBuffer, 1, stSaveParam.nImageLen, fp);
std::fclose(fp);
std::cout << "Image saved: " << outFile
<< ", bytes=" << stSaveParam.nImageLen << std::endl;
delete[] pImageBuffer;
camera.FreeImageBuffer(&stFrame);
camera.StopGrabbing();
camera.Close(); camera.Close();
CMvCamera::FinalizeSDK(); CMvCamera::FinalizeSDK();