Hikvisionロボット産業用カメラ共通パラメータ機能設定・取得(C言語)
- 序文
- カメラのプロパティツリー
-
- 1. デバイス制御/DeviceControl
- 2. カメラフォーマットコントロール/ImageFormatControl
- 3. 取得制御/AcquisitionControl
- 4. アナログコントロール/AnalogControl
- 5. デジタル IO コントロール/DigitalIOControl
- 6. アクションコマンドコントロール/ActionControl
- 7. ファイルアクセス制御/FileAccessControl
- 8. イベント監視/イベント制御
- 9. データブロック制御/ChunkDataControl
- 10. トランスポート層制御 / TransportLayerControl
- 11. ユーザーセットコントロール/UserSetControl
序文
この記事では、 Hikvision の産業カメラ
用でよく使用されるパラメータの設定方法と取得方法を簡単に紹介します。 Hikvision の産業用カメラ SDK のパラメーターが多すぎるので、時間があるときにゆっくり更新できます...
カメラのプロパティツリー
1. デバイス制御/DeviceControl
1.1 カメラのシリアル番号取得/DeviceSerialNumber
MVCC_STRINGVALUE stStrValue;
memset(&stStrValue, 0, sizeof(MVCC_STRINGVALUE));
nRet = MV_CC_GetStringValue(handle, "DeviceSerialNumber", &stStrValue);
if (MV_OK != nRet)
{
printf("Get DeviceSerialNumber fail! nRet [0x%x]\n", nRet);
}
printf("Current DeviceSerialNumber [%s]\n", stStrValue.chCurValue);
結果:
1.2 カメラカスタムネーミング設定と取得/DeviceUserID
nRet = MV_CC_SetStringValue(handle, "DeviceUserID", "UserIDChanged");
if (MV_OK != nRet)
{
printf("Set DeviceUserID fail! nRet [0x%x]\n", nRet);
}
MVCC_STRINGVALUE stStrValue;
memset(&stStrValue, 0, sizeof(MVCC_STRINGVALUE));
nRet = MV_CC_GetStringValue(handle, "DeviceUserID", &stStrValue);
if (MV_OK != nRet)
{
printf("Get DeviceUserID fail! nRet [0x%x]\n", nRet);
}
printf("Rename DeviceUserID [%s]\n", stStrValue.chCurValue);
結果:
1.3 カメラ起動時間/DeviceUptimeの取得
MVCC_INTVALUE_EX stIntValue = {
0};
nRet = MV_CC_GetIntValueEx(handle, "DeviceUptime", &stIntValue);
if (MV_OK != nRet)
{
printf("Get DeviceUptime fail! nRet [0x%x]\n", nRet);
}
printf("DeviceUptime [%d]\n", stIntValue.nCurValue);
結果:
2. カメラフォーマットコントロール/ImageFormatControl
2.1 カメラ画像の最大幅と高さを取得する
MVCC_INTVALUE_EX nWidthMaxValue= = {
0},nHeightMaxValue = {
0};
//如需获取当前相机图像宽高,需要将WidthMax替换成Width
nRet = MV_CC_GetIntValueEx(handle, "WidthMax", &nWidthMaxValue);
if (MV_OK != nRet)
{
printf("Get WidthMax fail! nRet [0x%x]\n", nRet);
}
//如需获取当前相机图像宽高,需要将HeightMax替换成Height
nRet = MV_CC_GetIntValueEx(handle, "HeightMax", &nHeightMaxValue);
if (MV_OK != nRet)
{
printf("Get HeightMax fail! nRet [0x%x]\n", nRet);
}
2.2 カメラ画像の ROI 領域を設定する
注: カメラが画像の幅と高さを設定すると、カメラはストリームを取得できません。開始グラビング前またはストップグラビング後に設定する必要があります。
unsigned int m_Width=1000,m_Height=1000;//要设置的步进值
//offset,设置的偏移值,图像左上角为原点,一般需要是2的倍数,不能是奇数
unsigned int m_OffsetX=256,m_OffsetY=256;
//获取图像宽高最大最小值,获取步进值
MVCC_INTVALUE_EX nWidthValue= {
0},nHeightValue = {
0};
//获取相机支持的宽高最大值
nRet = MV_CC_GetIntValueEx(handle, "Width", &nWidthValue);
nRet = MV_CC_GetIntValueEx(handle, "Height", &nHeightValue);
if(m_Width>nWidthValue.nMax||
m_Height > nHeightValue.nMax||
m_Width<nWidthValue.nMin||
m_Height < nHeightValue.nMin||
(m_Width+m_OffsetX)>nWidthValue.nMax|| //偏移值+设置值必须小于宽高的最大值
(m_Height +m_OffsetY)>nHeightValue.nMax||)
{
//判断有没有超出范围,超出范围就报错!!!
printf("Set Image Width or Height out of range !!\n", nRet);
}else
{
//避免offset有偏移值,导致后续设置宽高失败
nRet = MV_CC_SetIntValue(handle,"OffsetX",0);
nRet = MV_CC_SetIntValue(handle,"OffsetY",0);
if((m_Width%nWidthValue.nInc)==0&&(m_Height%nHeightValue.nInc)==0)//符合步进值才设置进去
{
nRet = MV_CC_SetIntValue(handle,"Width",m_Width);
if(nRet != MV_OK)
{
printf("Warning: Set Width fail nRet [0x%x]!", nRet);
}
nRet = MV_CC_SetIntValue(handle,"Height",m_Height);
if(nRet != MV_OK)
{
printf("Warning: Set Height fail nRet [0x%x]!", nRet);
}
nRet = MV_CC_SetIntValue(handle,"OffsetX",m_OffsetX);
if(nRet != MV_OK)
{
printf("Warning: Set OffsetX fail nRet [0x%x]!", nRet);
}
nRet = MV_CC_SetIntValue(handle,"OffsetY",m_OffsetY);
if(nRet != MV_OK)
{
printf("Warning: Set OffsetY fail nRet [0x%x]!", nRet);
}
}else
{
//不符合步进,减去余数再去设置宽高,此时设置的宽高与原宽高有差异
nRet = MV_CC_SetIntValue(handle,"Width",m_Width-m_Width%nWidthValue.nInc);
if(nRet != MV_OK)
{
printf("Warning: Set Width fail nRet [0x%x]!", nRet);
}
nRet = MV_CC_SetIntValue(handle,"Height",m_Height-m_Height%nHeightValue.nInc);
if(nRet != MV_OK)
{
printf("Warning: Set Height fail nRet [0x%x]!", nRet);
}
nRet = MV_CC_SetIntValue(handle,"OffsetX",m_OffsetX);
if(nRet != MV_OK)
{
printf("Warning: Set OffsetX fail nRet [0x%x]!", nRet);
}
nRet = MV_CC_SetIntValue(handle,"OffsetY",m_OffsetY);
if(nRet != MV_OK)
{
printf("Warning: Set OffsetY fail nRet [0x%x]!", nRet);
}
}
}
2.3 カメラ画像のROI領域を復元し、最大値を復元する
MVCC_INTVALUE_EX nWidthMaxValue= {
0},nHeightMaxValue = {
0};
nRet = MV_CC_GetIntValueEx(handle, "WidthMax", &nWidthMaxValue);
if (MV_OK != nRet)
{
printf("Get WidthMax fail! nRet [0x%x]\n", nRet);
}
nRet = MV_CC_GetIntValueEx(handle, "HeightMax", &nHeightMaxValue);
if (MV_OK != nRet)
{
printf("Get HeightMax fail! nRet [0x%x]\n", nRet);
}
//一定要先还原相机的偏移值,再去设置相机宽高
nRet = MV_CC_SetIntValue(handle,"OffsetX",0);
nRet = MV_CC_SetIntValue(handle,"OffsetY",0);
nRet = MV_CC_SetIntValue(handle,"Width",nWidthMaxValue.nCurValue);//设置为最大值
if(nRet != MV_OK)
{
printf("Warning: Set Width fail nRet [0x%x]!", nRet);
}
nRet = MV_CC_SetIntValue(handle,"Height",nHeightMaxValue.nCurValue);//设置为最大值
if(nRet != MV_OK)
{
printf("Warning: Set Height fail nRet [0x%x]!", nRet);
}
2.4 カメラがサポートする画像フォーマットを取得する
MV_XML_NODE_FEATURE stNodeFeature;
MV_XML_FEATURE_Enumeration stFeatureEnm;
memset(&stNodeFeature,0,sizeof(MV_XML_NODE_FEATURE));
memset(&stFeatureEnm, 0, sizeof(MV_XML_FEATURE_Enumeration));
strncpy(stNodeFeature.strName, "PixelFormat", strlen("PixelFormat"));
stNodeFeature.enType = IFT_IEnumeration;
nRet = MV_XML_GetNodeFeature(handle,&stNodeFeature,&stFeatureEnm);
if (MV_OK != nRet)
{
return nRet;
}else
{
for (int i = 0; i < stFeatureEnm.nSymbolicNum; i++)
{
printf("PixelFormat:%s \r\n", stFeatureEnm.strSymbolic[i]);//打印出相机支持的所有像素格式
}
for (int i = 0; i < stFeatureEnm.nSymbolicNum; i++)
{
if (strcmp(stFeatureEnm.strSymbolic[i] ,"BayerBG8")==0||
strcmp(stFeatureEnm.strSymbolic[i], "BayerRG8")==0||
strcmp(stFeatureEnm.strSymbolic[i], "BayerGB8")==0||
strcmp(stFeatureEnm.strSymbolic[i], "BayerGR8")==0||
strcmp(stFeatureEnm.strSymbolic[i], "RGB8Packed")==0||
strcmp(stFeatureEnm.strSymbolic[i], "BGR8Packed")==0)//比较相机参数格式,这里仅比较了bayer与RGB
{
printf("This is a Color camera \n");
break;
}
}
}
結果:
2.5 カメラ画像フォーマットの変更
//设置Enum型参数-相机图像格式
//注意点1:相机图像格式设置时,只有在MV_CC_Startgrab接口调用前才能设置,取流过程中,不能修改图像格式
nRet = MV_CC_SetEnumValue(handle, "PixelFormat", PixelType_Gvsp_Mono12);
if (MV_OK != nRet)
{
printf("error: Set PixelFormat fail [%x]\n", nRet);
}
2.6 カメラの内蔵テスト画像のオン/オフを切り替える
2.6.1 テスト画像をオフにする (デフォルトの状態)
nRet = MV_CC_SetEnumValue(handle, "TestPattern", 0);
if (MV_OK != nRet)
{
printf("Set TestPattern fail! nRet [0x%x]\n", nRet);
break;
}
2.6.2 テストイメージを開く
nRet = MV_CC_SetEnumValue(handle, "TestPattern", 9);
//0:off,9:ColorBar,14:ObliqueMonoBar,17:TestImage1
if (MV_OK != nRet)
{
printf("Set TestPattern fail! nRet [0x%x]\n", nRet);
break;
}
効果:
2.7 カメラ映像のXミラー、YミラーのON/OFF
nRet = MV_CC_SetBoolValue(handle, "ReverseX", true);
if (MV_OK != nRet)
{
printf("Set ReverseX fail! nRet [0x%x]\n", nRet);
}
//Y镜像需要注意两点
//1.部分相机不支持,所以可能设置不了,具体看相机规格书spec
//2.Y镜像需要停止采集状态下设置,不像X镜像一样可以实时设置,一般在MV_CC_StartGrabbing接口之前调用
nRet = MV_CC_SetBoolValue(handle, "ReverseY", true);
if (MV_OK != nRet)
{
printf("Set ReverseY fail! nRet [0x%x]\n", nRet);
}
効果:
2.8 カメラ埋め込み画像ウォーターマーク機能のオン/オフ
カメラの画像透かし情報は、カメラの内部情報を印刷および記録するために使用されます。透かし情報はストリーミング インターフェイスにあります。
画像構造内のカメラ透かしを取得する基本原理は、有効な画像の一部を置き換えることです。画像ヘッダーの先頭にある約40バイトの情報 画像データサイズを変えずに情報を伝達するための実データ情報
パラメータ | キーワード | パラメータ値 |
---|---|---|
タイムスタンプ | タイムスタンプ | 0 |
得 | 得 | 1 |
暴露 | 暴露 | 2 |
平均的な明るさ | 明るさ情報 | 3 |
ホワイトバランス | ホワイトバランス | 4 |
フレーム番号 | フレームカウンター | 5 |
トリガー数 | ExtTriggerCount | 6 |
IO入出力レベルステータス | ライン入力出力 | 7 |
ROIエリア | ROI位置 | 8 |
//必须停止采集状态下设置,一般在MV_CC_StartGrabbing接口之前调用
//开启相机图像水印,如下,打开了Exposure、BrightnessInfo、Framecounter
nRet = MV_CC_SetEnumValue(handle, "FrameSpecInfoSelector", 2);//Exposure
nRet = MV_CC_SetBoolValue(handle, "FrameSpecInfo", true);
nRet = MV_CC_SetEnumValue(handle, "FrameSpecInfoSelector", 3);//BrightnessInfo
nRet = MV_CC_SetBoolValue(handle, "FrameSpecInfo", true);
nRet = MV_CC_SetEnumValue(handle, "FrameSpecInfoSelector", 5);//Framecounter
nRet = MV_CC_SetBoolValue(handle, "FrameSpecInfo", true);
if (MV_OK != nRet)
{
printf("Set FrameSpecInfofail! nRet [0x%x]\n", nRet);
}
効果:
ストリームをアクティブに取得するプロセスで、ウォーターマーク情報が画像構造から取得され、
ウォーターマーク機能がオフになります。
//必须停止采集状态下设置,一般在MV_CC_StartGrabbing接口之前调用
nRet = MV_CC_SetEnumValue(handle, "FrameSpecInfoSelector", 5);//Framecounter
nRet = MV_CC_SetBoolValue(handle, "FrameSpecInfo", false);
3. 取得制御/AcquisitionControl
3.1 収集モードの設定
パラメータ | キーワード | パラメータ値 | 説明する |
---|---|---|---|
単一フレームのキャプチャ | シングルフレーム | 0 | 通常、visionpro などの特殊なソフトウェアで使用されるモードであり、通常はこのモードを使用することはお勧めしません。 |
継続取得 | 継続的 | 2 | 一般的に使用されるモード、ソフト トリガー単一フレーム取得、ハード トリガー取得、連続写真撮影はすべてこのモードを使用します |
nRet = MV_CC_SetEnumValue(handle, "AcquisitionMode", 2);
if (MV_OK != nRet)
{
printf("Set FrameSpecInfofail! nRet [0x%x]\n", nRet);
}
3.2 マルチフレーム取得設定/AcquisitionBurstFrameCount
AcquisitionBurstFrameCount: トリガー モードでは、トリガー後に取得されるフレームの数。デフォルトは 1 です。2
に設定すると、カメラは信号を受信して自動的に 2 つのフレームを取得し、取得頻度はフレーム レートに応じて変化します。
nRet = MV_CC_SetIntValue(handle,"AcquisitionBurstFrameCount",1);
if(nRet != MV_OK)
{
printf("Warning: Set AcquisitionBurstFrameCountfail nRet [0x%x]!", nRet);
}
3.3 フレームレート制御/AcquisitionFrameRate
//设置相机帧率,需注意不要超过相机支持的最大的帧率(相机规格书),超过了也没有意义
nRet =MV_CC_SetFloatValue(handle, "AcquisitionFrameRate", 5);
if(nRet != MV_OK)
{
printf("Warning: Set AcquisitionBurstFrameCountfail nRet [0x%x]!", nRet);
}
//帧率控制使能,true表示打开,false标识关闭
nRet = MV_CC_SetBoolValue(handle, "AcquisitionFrameRateEnable", true);
if(nRet != MV_OK)
{
printf("Warning: Set AcquisitionBurstFrameCountfail nRet [0x%x]!", nRet);
}
3.4 トリガーモードの設定
3.4.1 ソフトトリガー設定/ソフトウェア
// ch:设置触发模式为on
nRet = MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_ON);
if (MV_OK != nRet)
{
printf("Set Trigger Mode fail! nRet [0x%x]\n", nRet);
}
// ch:设置触发源为软触发
nRet = MV_CC_SetEnumValue(handle, "TriggerSource",MV_TRIGGER_SOURCE_SOFTWARE);//TriggerSource:7
if (MV_OK != nRet)
{
printf("Set Trigger Source fail! nRet [0x%x]\n", nRet);
}
写真を撮る必要がある場合は、コマンド コマンドを実行し、それを 1 回実行すると、カメラが写真を撮影します (startgrabing コマンドが有効になった後にのみ機能します)。
nRet = MV_CC_SetCommandValue(handle, "TriggerSoftware");//相机拍照
if (MV_OK != nRet)
{
printf("TriggerSoftware fail! nRet [0x%x]\n", nRet);
}
3.4.2 ハードトリガー設定/ライン
ハード トリガーはハード トリガーの配線と一致する必要があり、一致するパラメーターが多数あります。参照: Hikvision 産業用カメラ機能モジュール - IO 入力および出力制御
含まれるもの:
1. トリガー モード: TriggerMode は 1 に設定され、トリガー モードは 1 に設定されます。 2.
トリガー ソースの選択: TriggerSource 0 に設定し、line0 を選択します。line2 を選択することもできますが、line0 と line2 はハードウェア回路の配線に依存しますが、いずれにしてもソフト トリガーとハード トリガーを同時にサポートします。カメラがサポートしているかどうかによって異なります。 3. エッジ信号 TriggerActivation: デフォルトの立ち上がりエッジ
トリガー (設定できません)
4. トリガー キャッシュ TriggerCacheEnable: デフォルトでは無効です。カメラが 2 つのトリガー信号を同時に受信した場合、この機能がオンになっていない場合、カメラは 1 つの信号にのみ応答して画像を生成し、オンになると、カメラは自動的に 2 番目の信号をキャッシュして処理します。前の信号が処理された直後 バッファー信号
5. トリガー遅延 TriggerDelay: 信号を受信した後、露光前の一定期間の固定遅延
6. フィルター設定 LineDebouncerTime: 信号のグリッチとジッターを除去し、実際の条件に応じて調整します
// ch:设置触发模式为on
nRet = MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_ON);
if (MV_OK != nRet)
{
printf("Set Trigger Mode fail! nRet [0x%x]\n", nRet);
}
// ch:设置触发源为line硬触发
nRet = MV_CC_SetEnumValue(handle, "TriggerSource",MV_TRIGGER_SOURCE_LINE0);//line0:0,line2:2
if (MV_OK != nRet)
{
printf("Set Trigger Source fail! nRet [0x%x]\n", nRet);
}
3.4.3 任意のトリガー設定/Anyway
とにかく、カメラはソフト トリガー コマンドに応答でき、line0、line2 のハード トリガー信号にも応答できます
。この機能を使用する必要がある場合は、カメラがこの機能をサポートしているかどうかを知る必要があることに注意してください。
// ch:设置触发模式为on
nRet = MV_CC_SetEnumValue(handle, "TriggerMode", MV_TRIGGER_MODE_ON);
if (MV_OK != nRet)
{
printf("Set Trigger Mode fail! nRet [0x%x]\n", nRet);
}
// ch:设置触发源为anyway
nRet = MV_CC_SetEnumValue(handle, "TriggerSource",24);//line0:0,line2:2,anyway:24
if (MV_OK != nRet)
{
printf("Set Trigger Source fail! nRet [0x%x]\n", nRet);
}
3.5 露出設定
3.5.1 マニュアル露出設定
nRet = MV_CC_SetEnumValue(handle, "ExposureMode",0);//0:Timed
nRet = MV_CC_SetFloatValue(handle, "ExposureTime", 1000);
if (MV_OK != nRet)
{
printf("Set ExposureTime fail nRet [0xd%]\n!", nRet);
}
3.5.2 自動露出設定
nRet = MV_CC_SetEnumValue(handle, "ExposureMode",0);//0:Timed
//ExposureAuto
nRet = MV_CC_SetFloatValue(handle, "ExposureAuto", 2);//0:off 1:once 2:Continuous
if (MV_OK != nRet)
{
printf("Set ExposureAuto fail nRet [0xd%]\n!", nRet);
}else{
//只有自动曝光或者自动增益开启后,Brightness亮度值方可设置
nRet = MV_CC_SetIntValue(handle,"Brightness",160);
if(nRet != MV_OK)
{
printf("Set BrightnessnRet [0x%x]!", nRet);
}
}
3.5.3 超短露光設定
//标准曝光模式
nRet = MV_CC_SetEnumValue(handle, "ExposureMode",0);//0:Timed
nRet = MV_CC_SetEnumValue(handle, "ExposureTimeMode", 0);//0:Standard,1:UltraShort
if (MV_OK != nRet)
{
printf("Set Trigger Mode fail! nRet [0x%x]\n", nRet);
}else
{
printf("ExposureTimeMode :Standard\n");
//需要注意曝光值范围
nRet = MV_CC_SetFloatValue(handle, "ExposureTime", 1000);
if (MV_OK != nRet)
{
printf("Set ExposureTime fail nRet [0xd%]\n!", nRet);
}
}
//超短曝光模式
nRet = MV_CC_SetEnumValue(handle, "ExposureTimeMode", 1);//0:standard,1:UltraShort
if (MV_OK != nRet)
{
printf("Set Trigger Mode fail! nRet [0x%x]\n", nRet);
}else
{
printf("ExposureTimeMode :UltraShort\n");
//需要注意曝光值范围
nRet = MV_CC_SetFloatValue(handle, "ExposureTime", 12);
if (MV_OK != nRet)
{
printf("Set ExposureTime fail nRet [0xd%]\n!", nRet);
}
}
3.6 HDR多重露出ゲイン切り替え
unsigned ExpValue[4]={
2000,3000,2500,1300};
unsigned GainValue[4]={
0,1,2,3};
for (int i = 0; i < 4; i++)
{
nRet = MV_CC_SetIntValue(handle,"HDRSelector",i);//设置为最大值
if(nRet != MV_OK)
{
printf("Warning: Set HDRSelector fail nRet [0x%x]!", nRet);
}
nRet = MV_CC_SetIntValue(handle,"HDRShutter",ExpValue[i]);//设置为最大值
if(nRet != MV_OK)
{
printf("Warning: Set HDRShutter fail nRet [0x%x]!", nRet);
}
nRet =MV_CC_SetFloatValue(handle, "HDRGain", GainValue[i]);
if(nRet != MV_OK)
{
printf("Warning: Set HDRGain nRet [0x%x]!", nRet);
}
}
4. アナログコントロール/AnalogControl
4.1 アナログゲイン設定
nRet = MV_CC_SetFloatValue(handle, "Gain", 1;
if (MV_OK != nRet)
{
printf("Set Gainfail fail nRet [0xd%]\n", nRet);
}
4.2 デジタルゲイン設定
//打开数字增益使能
nRet = MV_CC_SetBoolValue(handle, "DigitalShiftEnable", true);
if (MV_OK != nRet)
{
printf("Set DigitalShiftEnable fail! nRet [0x%x]\n", nRet);
}
//设置数字增益,范围-6~6db
nRet = MV_CC_SetFloatValue(handle, "DigitalShift", 1);
if (MV_OK != nRet)
{
printf("Set DigitalShift fail !nRet [0xd%]\n", nRet);
}
4.3 ガンマ設定/ガンマ
//1.打开数字增益使能
nRet = MV_CC_SetBoolValue(handle, "GammaEnable", true);
if (MV_OK != nRet)
{
printf("Set GammaEnable fail! nRet [0x%x]\n", nRet);
}
//2.设置gamma类型,user:1,sRGB:2
nRet = MV_CC_SetEnumValue(handle, "GammaSelector", 1);
if (MV_OK != nRet)
{
printf("Set GammaSelector fail! nRet [0x%x]\n", nRet);
}
//3.设置gamma值,推荐范围0.5-2,1为线性拉伸
nRet = MV_CC_SetFloatValue(handle, "Gamma", 1);
if (MV_OK != nRet)
{
printf("Set Gamma failed! nRet [0xd%]\n", nRet);
}
4.4 シャープネス設定/シャープネス
4.4.1 カメラのシャープネス設定
産業用カメラ自体の内部処理はシャープネス設定をサポートしています(カメラハードウェアISP処理)。
シャープネスはカメラ画像フォーマットに注意する必要があります。例えば、YUV、RGB、MONO10、MONO12などのフォーマットはシャープネスをサポートしていないため、他の方法で実現する必要がある
//打开锐度使能
nRet = MV_CC_SetBoolValue(handle, "SharpnessEnable", true);
if (MV_OK != nRet)
{
printf("Set SharpnessEnable failed! nRet [0x%x]\n", nRet);
}
//设置锐度,范围0-100
nRet = MV_CC_SetFloatValue(handle, "Sharpness", 1);
if (MV_OK != nRet)
{
printf("Set Sharpness failed nRet [0xd%]\n", nRet);
}
4.4.2SDKのシャープネス設定
場合によっては、カメラ ハードウェアがシャープネス処理をサポートしていない場合、Hikvision SDK はソフトウェア レベルでシャープネス インターフェイス呼び出しを提供します。サポートされるのは、mono8 形式と
RGB 形式のみです。他の画像形式は、最初にこれら 2 つの形式に変換する必要があります。
static unsigned int __stdcall WorkThread(void* pUser)
{
int nRet = MV_OK;
unsigned char *pConvertData = NULL;
unsigned char *pSharpenData = NULL;
unsigned int nConvertDataSize = 0;
MV_FRAME_OUT stImageInfo = {
0}; //图像帧信息结构体
MV_DISPLAY_FRAME_INFO stDisplayInfo = {
0}; //用于显示的
MV_CC_PIXEL_CONVERT_PARAM stConvertParam = {
0}; //用于格式转化的
MV_CC_SHARPEN_PARAM stSharpenParam ={
0}; //用于锐度的
while(1)
{
nRet = MV_CC_GetImageBuffer(pUser, &stImageInfo, 1000);//取一帧图像
if (nRet == MV_OK)
{
printf("Get Image Buffer: Width[%d], Height[%d], FrameNum[%d]\n",
stImageInfo.stFrameInfo.nWidth, stImageInfo.stFrameInfo.nHeight, stImageInfo.stFrameInfo.nFrameNum);
MvGvspPixelType enDstPixelType = PixelType_Gvsp_Undefined;
unsigned int nChannelNum = 0;//用于判断图像通道数
char chFileName[MAX_PATH] = {
0};
//如果是彩色则转成RGB8
//isColor,isMono函数,看相机图像格式介绍章节
if (IsColor(stImageInfo.stFrameInfo.enPixelType))//判断相机图像原始数据格式是什么
{
nChannelNum = 3;
enDstPixelType = PixelType_Gvsp_RGB8_Packed;
sprintf(chFileName, "AfterConvert.rgb");
}
//如果是黑白则转换成Mono8
else if (IsMono(stImageInfo.stFrameInfo.enPixelType))
{
nChannelNum = 1;
enDstPixelType = PixelType_Gvsp_Mono8;
sprintf(chFileName, "AfterConvert.gray");
}
else
{
printf("Don't need to convert!\n");
}
if (enDstPixelType != PixelType_Gvsp_Undefined)
{
if (NULL == pConvertData)
{
//分配一块区域用于格式转化
pConvertData = (unsigned char*)malloc(stImageInfo.stFrameInfo.nWidth * stImageInfo.stFrameInfo.nHeight * nChannelNum);
if (NULL == pConvertData)
{
printf("malloc pConvertData fail!\n");
nRet = MV_E_RESOURCE;
break;
}
}
nConvertDataSize = stImageInfo.stFrameInfo.nWidth * stImageInfo.stFrameInfo.nHeight * nChannelNum;
// ch:像素格式转换 | en:Convert pixel format
stConvertParam.nWidth = stImageInfo.stFrameInfo.nWidth; //ch:图像宽 | en:image width
stConvertParam.nHeight = stImageInfo.stFrameInfo.nHeight; //ch:图像高 | en:image height
stConvertParam.pSrcData = stImageInfo.pBufAddr; //ch:输入数据缓存 | en:input data buffer
stConvertParam.nSrcDataLen = stImageInfo.stFrameInfo.nFrameLen; //ch:输入数据大小 | en:input data size
stConvertParam.enSrcPixelType = stImageInfo.stFrameInfo.enPixelType; //ch:输入像素格式 | en:input pixel format
stConvertParam.enDstPixelType = enDstPixelType; //ch:输出像素格式 | en:output pixel format
stConvertParam.pDstBuffer = pConvertData; //ch:输出数据缓存 | en:output data buffer
stConvertParam.nDstBufferSize = nConvertDataSize; //ch:输出缓存大小 | en:output buffer size
nRet = MV_CC_ConvertPixelType(pUser, &stConvertParam);//图像格式转化
if (MV_OK != nRet)
{
printf("Convert Pixel Type fail! nRet [0x%x]\n", nRet);
break;
}else
{
printf("Convert Pixel Type ok!\n");
}
}
if(g_Sharpen)//全局变量,用于判断要不要做锐化
{
if (NULL == pSharpenData)
{
pSharpenData = (unsigned char*)malloc(stImageInfo.stFrameInfo.nWidth * stImageInfo.stFrameInfo.nHeight * nChannelNum);
if (NULL == pSharpenData)
{
printf("malloc pConvertData fail!\n");
nRet = MV_E_RESOURCE;
break;
}
}
stSharpenParam.nWidth = stImageInfo.stFrameInfo.nWidth;
stSharpenParam.nHeight = stImageInfo.stFrameInfo.nHeight;
stSharpenParam.enPixelType = enDstPixelType; //像素格式变化,用转化后的图像格式传入
stSharpenParam.pSrcBuf = stConvertParam.pDstBuffer; //输入
stSharpenParam.nSrcBufLen = stConvertParam.nDstBufferSize;//数据大小变化
stSharpenParam.pDstBuf = pSharpenData; //输出,后续处理要用这个数据啦
stSharpenParam.nDstBufSize = stConvertParam.nDstBufferSize; //数据大小变化
stSharpenParam.nSharpenAmount = m_nSharpenAmount;
stSharpenParam.nSharpenRadius = m_nSharpenRadius;
stSharpenParam.nSharpenThreshold = m_nSharpenThreshold;
nRet = MV_CC_ImageSharpen(pUser, &stSharpenParam);
if (MV_OK != nRet)
{
printf("Image Sharpen fail! nRet [0x%x]\n", nRet);
break;
}else
{
printf("Sharpen :50 ok!\n");
}
}
T2=qMyMilliseconds();//计时函数,可以删除
printf("Grab ok!,costtime:%f\n",T2-T1);
if (g_hwnd)
{
stDisplayInfo.hWnd = g_hwnd;
stDisplayInfo.pData = pSharpenData;
stDisplayInfo.nDataLen = nConvertDataSize;
stDisplayInfo.nWidth = stImageInfo.stFrameInfo.nWidth;
stDisplayInfo.nHeight = stImageInfo.stFrameInfo.nHeight;
stDisplayInfo.enPixelType = enDstPixelType;//像素格式变化
nRet =MV_CC_DisplayOneFrame(pUser, &stDisplayInfo);
}
MV_SAVE_IMG_TO_FILE_PARAM stSaveFileParam;//存图测试,可以删除,不调用
memset(&stSaveFileParam, 0, sizeof(MV_SAVE_IMG_TO_FILE_PARAM));
stSaveFileParam.enImageType = MV_Image_Bmp; // ch:需要保存的图像类型 | en:Image format to save
stSaveFileParam.enPixelType = enDstPixelType; // ch:相机对应的像素格式 | en:Camera pixel type
stSaveFileParam.nWidth = stImageInfo.stFrameInfo.nWidth; // ch:相机对应的宽 | en:Width
stSaveFileParam.nHeight = stImageInfo.stFrameInfo.nHeight; // ch:相机对应的高 | en:Height
stSaveFileParam.nDataLen = nConvertDataSize;
stSaveFileParam.pData = pSharpenData;
stSaveFileParam.iMethodValue = 0;
// ch:jpg图像质量范围为(50-99], png图像质量范围为[0-9] | en:jpg image nQuality range is (50-99], png image nQuality range is [0-9]
if (MV_Image_Bmp == stSaveFileParam.enImageType)
{
sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d_%d_%d_%d.bmp", stSaveFileParam.nWidth, stSaveFileParam.nHeight, stImageInfo.stFrameInfo.nFrameNum,m_nSharpenAmount,m_nSharpenAmount,m_nSharpenThreshold);
}
nRet = MV_CC_SaveImageToFile(pUser,&stSaveFileParam);
if(nRet != MV_OK)
{
printf("MV_CC_SaveImageToFile fail! nRet [0x%x]\n", nRet);
}else
{
printf("MV_CC_SaveImageToFile ok!\n");
}
nRet = MV_CC_FreeImageBuffer(pUser, &stImageInfo);
if(nRet != MV_OK)
{
printf("Free Image Buffer fail! nRet [0x%x]\n", nRet);
}
}
else
{
//printf("Get Image fail! nRet [0x%x]\n", nRet);
}
if(g_bExit)
{
break;
}
}
return 0;
}
4.5 ホワイトバランス設定/BalanceWhiteAuto
4.5.1 オートホワイトバランス
//开启自动白平衡
nRet = MV_CC_SetEnumValue(handle, "BalanceWhiteAuto", 1);
if (MV_OK != nRet)
{
printf("Set BalanceWhiteAuto fail! nRet [0x%x]\n", nRet);
}
//取流之后,自动白平衡采集一段时间,相机自动调整
//调整完毕后后,关闭自动白平衡,即可
sleep(2000);
//关闭自动白平衡
nRet = MV_CC_SetEnumValue(handle, "BalanceWhiteAuto", 0);
if (MV_OK != nRet)
{
printf("Set BalanceWhiteAuto fail! nRet [0x%x]\n", nRet);
}
4.5.2 マニュアルホワイトバランス
//关闭自动白平衡
nRet = MV_CC_SetEnumValue(handle, "BalanceWhiteAuto", 0);
if (MV_OK != nRet)
{
printf("Set BalanceWhiteAuto fail! nRet [0x%x]\n", nRet);
break;
}
//手动白平衡设置
int BalanceRatio_Value[3]={
1100,1024,1800};//R、G、B
for (int i = 0; i < 3; i++)
{
nRet = MV_CC_SetEnumValue(handle, "BalanceRatioSelector", i);
nRet = MV_CC_SetIntValue(handle, "BalanceRatio",BalanceRatio_Value[i]);
}
5. デジタル IO コントロール/DigitalIOControl
5.1IO出力制御
カメラ IO 制御は、主に IO 信号出力の制御に使用されます。詳細については、記事の IO 出力の部分を参照してください: Hikvision 産業用カメラ機能モジュール - IO 入力および出力制御
5.2 IO 出力と出力イベントの概要
IO 出力はカメラによって制御することもできます。カメラが動作するさまざまな時間枠で、外部デバイスを制御するために出力信号が与えられます。Hikvision 産業用カメラでサポートされている IO イベントには次のものが含まれます:
イベントソース名 | キーワード | パラメータ値 | 機能の説明 |
---|---|---|---|
露光開始 | 露出開始アクティブ | 0 | センサーが露出し始めると、出力信号が |
収集開始 | 取得開始アクティブ | 1 | データ読み出し開始時の出力信号、フレーム読み出し開始時刻 |
回収終了 | 取得停止アクティブ | 2 | データ読み出し終了時の出力信号、フレーム読み出し終了時刻 |
プロットの開始 | フレームバーストスタートアクティブ | 3 | 信号は画像データがリンク経由で送信され始めるときに出力され、brust>2 の場合にのみ信号が出力されますが、これは多くの場合役に立ちません。 |
描画の終わり | フレームバーストエンドアクティブ | 4 | 画像データがリンク経由で送信される場合、信号はリンクの終端で出力され、信号は brust>2 の場合にのみ出力され、多くの場合役に立ちません。 |
ソフトトリガー出力 | ソフトトリガーアクティブ | 5 | ソフトウェアはコマンドを呼び出し、コマンド時間、出力、ユーザーが独立して制御できます |
ハードトリガー出力 | ハードトリガーアクティブ | 6 | カメラ入力信号 line0\2 が入力信号を受信すると、出力信号を出力します。 |
カウンタ出力 | タイマーアクティブ | 7 | タイマー、line0とline2が受信した指定信号の数を計算し、出力信号を出力します |
トリガ待ち出力 | フレームトリガー待機 | 8 | カメラをトリガーすることができ、露出が収集されるとトリガー信号が発生します。 |
一般的に使用されるのは、露光開始、ソフト トリガー出力、およびハード トリガー出力です
。例:
//参数初始化
nRet = MV_CC_SetEnumValue(handle, "LineSelector", 2); //选择对应的硬件输出源
//0:Line0 1:Line1 2:Line2
nRet = MV_CC_SetEnumValue(handle, "LineMode", 8); //仅line2需要设置
//0:Input 1:Output 8:Strobe
nRet = MV_CC_SetEnumValue(handle, "LineSource", 5);
//0:ExposureStartActive 5:SoftTriggerActive 6:HardTriggerActive
int DurationValue=1000,DelayValue=100,PreDelayValue=0;//us
nRet = MV_CC_SetIntValue(handle, "StrobeLineDuration",DurationValue);//脉宽持续时间
nRet = MV_CC_SetIntValue(handle, "StrobeLineDelay",DelayValue);//strobe延时,从曝光开始,延时多久输出
nRet = MV_CC_SetIntValue(handle, "StrobeLinePreDelay",PreDelayValue);//strobe提前输出,曝光延后开始
nRet = MV_CC_SetBoolValue(handle, "StrobeEnable",TRUE);
//Strobe输出使能,使能之后,上面配置参数生效,IO输出与LineSource同步
//-------------------------------------------------------------------------------------
//输出IO信号命令,需要时,调用此行代码,相机通过line2输出一个周期1100us的方波,有效脉宽1000us
nRet = MV_CC_SetCommandValue(m_handle, "LineTriggerSoftware");
6. アクションコマンドコントロール/ActionControl
7. ファイルアクセス制御/FileAccessControl
8. イベント監視/イベント制御
8.1 露光終了時間
9. データブロック制御/ChunkDataControl
10. トランスポート層制御 / TransportLayerControl
10.1 ハートビート時間の設定
//mv_cc_Opendevice之后调用
//推荐值3000-60000ms,不建议低于3000ms,容易掉线
nRet = MV_CC_SetIntValue(handle,"GevHeartbeatTimeout",3000);//单位ms
if(nRet != MV_OK)
{
printf("Warning: Set Width fail nRet [0x%x]!", nRet);
}
11. ユーザーセットコントロール/UserSetControl
11.1 パラメータをカメラに保存する
カメラの電源をオフにしてもパラメータが消えないように、パラメータをユーザーセットに保存します。
//初始化部分,放在Opendevice之后即可
nRet = MV_CC_SetEnumValue(handle, "UserSetSelector", 1);//支持1、2、3组,3组不同参数保存
if (MV_OK != nRet)
{
printf("error: SetEnumValue UserSetSelector fail [%x]\n", nRet);
}
nRet = MV_CC_SetEnumValue(handle, "UserSetDefault", 1);//选择上电后,默认加载那一组参数
if (MV_OK != nRet)
{
printf("error: SetEnumValue UserSetDefault fail [%x]\n", nRet);
}
//大部分参数修改完成后,调用此命令进行保存,不建议频繁调用
nRet = MV_CC_SetCommandValue(m_handle, "UserSetSave");//保存命令
if (MV_OK != nRet)
{
printf("error: SetCommandValue fail [%x]\n", nRet);
}
11.2 工場出荷時のデフォルトパラメータを復元する
//相机停止采集后才能调用
nRet = MV_CC_SetEnumValue(handle, "UserSetSelector", 0);//1、2、3是用户自己保存的参数,0是相机出厂参数
if (MV_OK != nRet)
{
printf("error: SetEnumValue UserSetSelector fail [%x]\n", nRet);
}
nRet = MV_CC_SetCommandValue(m_handle, "UserSetLoad");//加载0组参数
if (MV_OK != nRet)
{
printf("error: SetCommandValue fail [%x]\n", nRet);
}