Réglage et acquisition de la fonction de paramètre commun de la caméra industrielle du robot Hikvision (langage C)
- avant-propos
- Arbre des propriétés de la caméra
-
- 1. Contrôle de l'appareil/Contrôle de l'appareil
- 2. Contrôle du format de l'appareil photo/ImageFormatControl
-
- 2.1 Obtenir la largeur et la hauteur maximales de l'image de la caméra
- 2.2 Définir la zone ROI de l'image de la caméra
- 2.3 Restaurer la zone ROI de l'image de la caméra et restaurer la valeur maximale
- 2.4 Obtenir le format d'image pris en charge par la caméra
- 2.5 Modifier le format d'image de la caméra
- 2.6 Activer/désactiver l'image de test intégrée de la caméra
- 2.7 Activer/désactiver l'image de la caméra miroir X, miroir Y
- 2.8 Activer/désactiver la fonction de filigrane d'image intégrée à la caméra
- 3. Contrôle des acquisitions/Contrôle des acquisitions
- 4. Contrôle analogique/Contrôle analogique
- 5. Contrôle E/S numérique/DigitalIOControl
- 6. Contrôle de commande d'action/ActionControl
- 7. Contrôle d'accès aux fichiers/FileAccessControl
- 8. Surveillance des événements/Contrôle des événements
- 9. Contrôle de bloc de données/ChunkDataControl
- 10. Contrôle de la couche transport / TransportLayerControl
- 11. Contrôle de jeu d'utilisateur/UserSetControl
avant-propos
Cet article présente brièvement la méthode de réglage et la méthode d'acquisition des paramètres couramment utilisés des caméras industrielles
Hikvision . Réglage Si vous n'êtes pas pressé, lisez simplement les deux blogs ci-dessus en premier, et vous pourrez vous familiariser avec la composition globale du sdk de la caméra industrielle de Hikvision. Il y a trop de paramètres, et vous pouvez les mettre à jour lentement quand vous avez le temps...
Arbre des propriétés de la caméra
1. Contrôle de l'appareil/Contrôle de l'appareil
1.1 Acquisition du numéro de série de la caméra/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);
résultat:
1.2 Paramètre de nommage personnalisé de la caméra et acquisition/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);
résultat:
1.3 Acquisition du temps de mise sous tension de la caméra/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);
résultat:
2. Contrôle du format de l'appareil photo/ImageFormatControl
2.1 Obtenir la largeur et la hauteur maximales de l'image de la caméra
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 Définir la zone ROI de l'image de la caméra
Remarque : Lorsque la caméra définit la largeur et la hauteur de l'image, la caméra ne peut pas prendre le flux : elle doit être définie avant le démarrage ou après l'arrêt.
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 Restaurer la zone ROI de l'image de la caméra et restaurer la valeur maximale
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 Obtenir le format d'image pris en charge par la caméra
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;
}
}
}
résultat:
2.5 Modifier le format d'image de la caméra
//设置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 Activer/désactiver l'image de test intégrée de la caméra
2.6.1 Désactiver l'image de test (état par défaut)
nRet = MV_CC_SetEnumValue(handle, "TestPattern", 0);
if (MV_OK != nRet)
{
printf("Set TestPattern fail! nRet [0x%x]\n", nRet);
break;
}
2.6.2 Ouvrir l'image test
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;
}
Effet:
2.7 Activer/désactiver l'image de la caméra miroir X, miroir Y
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);
}
Effet:
2.8 Activer/désactiver la fonction de filigrane d'image intégrée à la caméra
Les informations de filigrane d'image de la caméra sont utilisées pour imprimer et enregistrer les informations internes de la caméra. Les informations de filigrane se trouvent dans l'interface de diffusion. Le principe
essentiel pour obtenir le filigrane de la caméra dans la structure de l'image est de remplacer une petite partie de l'effectif informations au début de l'en-tête d'image, occupant environ 40 octets Informations de données réelles pour la transmission d'informations sans entraîner de modifications de la taille des données d'image
paramètre | Mots clés | valeur du paramètre |
---|---|---|
horodatage | Horodatage | 0 |
gagner | Gagner | 1 |
exposition | Exposition | 2 |
luminosité moyenne | LuminositéInfo | 3 |
balance des blancs | Balance des blancs | 4 |
Numéro de cadre | Compteur d'images | 5 |
nombre de déclencheurs | ExtTriggerCount | 6 |
État du niveau d'entrée et de sortie IO | LineInputOutput | 7 |
Zone de retour sur investissement | ROIPosition | 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);
}
Effet :
lors du processus de récupération active du flux, les informations de filigrane sont obtenues à partir de la structure de l'image et
la fonction de filigrane est désactivée.
//必须停止采集状态下设置,一般在MV_CC_StartGrabbing接口之前调用
nRet = MV_CC_SetEnumValue(handle, "FrameSpecInfoSelector", 5);//Framecounter
nRet = MV_CC_SetBoolValue(handle, "FrameSpecInfo", false);
3. Contrôle des acquisitions/Contrôle des acquisitions
3.1 Réglage du mode de collecte
paramètre | Mots clés | valeur du paramètre | illustrer |
---|---|---|---|
acquisition d'une seule image | SingleFrame | 0 | Il est généralement utilisé pour des logiciels spéciaux tels que visionpro, et il n'est pas recommandé d'utiliser ce mode normalement. |
acquisition continue | Continu | 2 | Modes couramment utilisés, acquisition d'une seule image à déclenchement doux, acquisition à déclenchement dur, prise de photos en continu, tous utilisent ce mode |
nRet = MV_CC_SetEnumValue(handle, "AcquisitionMode", 2);
if (MV_OK != nRet)
{
printf("Set FrameSpecInfofail! nRet [0x%x]\n", nRet);
}
3.2 Paramètres d'acquisition multi-images/AcquisitionBurstFrameCount
AcquisitionBurstFrameCount : en mode déclencheur, combien d'images sont acquises une fois déclenchées, la valeur par défaut est 1 ;
si elle est définie sur 2, la caméra reçoit un signal et acquiert automatiquement deux images, et la fréquence d'acquisition change en fonction de la fréquence d'images
nRet = MV_CC_SetIntValue(handle,"AcquisitionBurstFrameCount",1);
if(nRet != MV_OK)
{
printf("Warning: Set AcquisitionBurstFrameCountfail nRet [0x%x]!", nRet);
}
3.3 Contrôle de la fréquence d'images/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 Réglage du mode de déclenchement
3.4.1 Réglage du déclenchement progressif/Logiciel
// 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);
}
Lorsque vous devez prendre une photo, exécutez la commande command, exécutez-la une fois et l'appareil photo prendra une photo (uniquement après l'activation de la commande startgrabing)
nRet = MV_CC_SetCommandValue(handle, "TriggerSoftware");//相机拍照
if (MV_OK != nRet)
{
printf("TriggerSoftware fail! nRet [0x%x]\n", nRet);
}
3.4.2 Réglage/ligne de déclenchement dur
Le déclencheur dur doit être associé au câblage du déclencheur dur, et il existe de nombreux paramètres correspondants . Reportez-vous à : Module de fonction de caméra industrielle Hikvision - Contrôle d'entrée et de sortie IO,
y compris :
1. Mode de déclenchement : TriggerMode est défini sur 1, le mode de déclenchement est allumé
2. Sélection de la source de déclenchement : TriggerSource Réglez-le sur 0, choisissez line0, vous pouvez également choisir line2, ou choisir de toute façon ; line0 et line2 dépendent du câblage du circuit matériel, prennent de toute façon en charge le déclenchement doux et le déclenchement dur en même temps, il dépend si la caméra prend en charge 3. Edge signal TriggerActivation :
déclencheur de front montant par défaut (ne peut pas être défini)
4. Trigger cache TriggerCacheEnable : désactivé par défaut. Lorsque l'appareil photo reçoit deux signaux de déclenchement en même temps, si cette fonction n'est pas activée, l'appareil photo ne répondra qu'à un seul signal et produira une image ; une fois allumé, l'appareil photo mettra automatiquement en cache le deuxième signal et traitera immédiatement après le traitement du signal précédent Signal tampon
5. Délai de déclenchement TriggerDelay : après réception du signal, un délai fixe pendant une période de temps avant l'exposition
6. Réglage du filtre LineDebouncerTime : supprimez les problèmes de signal et la gigue, ajustez en fonction des conditions réelles
// 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 Réglage de déclenchement arbitraire/Quoi qu'il en soit
Quoi qu'il en soit, la caméra peut répondre aux commandes de déclenchement progressif et peut également répondre aux signaux de déclenchement dur line0, line2
Notez que lorsque vous devez utiliser cette fonction, vous devez savoir si la caméra prend en charge cette fonction
// 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 Paramètres d'exposition
3.5.1 Réglage manuel de l'exposition
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 Réglage de l'exposition automatique
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 Réglage de l'exposition ultra-courte
//标准曝光模式
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);
}
}
Commutation de gain multi-exposition 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. Contrôle analogique/Contrôle analogique
4.1 Réglage du gain analogique
nRet = MV_CC_SetFloatValue(handle, "Gain", 1;
if (MV_OK != nRet)
{
printf("Set Gainfail fail nRet [0xd%]\n", nRet);
}
4.2 Réglage du gain numérique
//打开数字增益使能
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 Réglage Gamma/Gamma
//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 Réglage de la netteté/Netteté
4.4.1 Paramètres de netteté de l'appareil photo
Le traitement interne de la caméra industrielle elle-même prend en charge le réglage de la netteté (traitement ISP du matériel de la caméra).
La netteté doit prêter attention au format d'image de la caméra. Par exemple, YUV, RVB, MONO10, MONO12 et d'autres formats ne prennent pas en charge la netteté, il doit être réalisé par d'autres méthodes
//打开锐度使能
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.2 Réglage de la netteté du SDK
Lorsque le matériel de la caméra ne prend pas en charge le traitement de la netteté dans certains cas, Hikvision SDK fournit un appel d'interface de netteté au niveau du logiciel.
Seuls les formats mono8 et RVB sont pris en charge. Les autres formats d'image doivent d'abord être convertis en ces deux formats.
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 Réglage de la balance des blancs/BalanceWhiteAuto
4.5.1 Balance des blancs automatique
//开启自动白平衡
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 Balance des blancs manuelle
//关闭自动白平衡
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. Contrôle E/S numérique/DigitalIOControl
Contrôle de sortie 5.1IO
Le contrôle IO de la caméra est principalement utilisé pour contrôler la sortie du signal IO .
5.2 Introduction à la sortie IO et aux événements de sortie
La sortie IO peut également être contrôlée par la caméra. À différentes périodes de temps lorsque la caméra fonctionne, un signal de sortie est donné pour contrôler les appareils externes. Les événements IO pris en charge par les caméras industrielles Hikvision incluent les éléments suivants :
nom de la source d'événement | Mots clés | valeur du paramètre | Description de la fonction |
---|---|---|---|
début de l'exposition | ExpositionDébutActif | 0 | Lorsque le capteur commence à s'exposer, le signal de sortie |
début de la collecte | AcquisitionStartActive | 1 | Signal de sortie au démarrage de la lecture des données, heure de début de la lecture des trames |
fin de collecte | AcquisitionArrêtActif | 2 | Signal de sortie à la fin de la lecture des données, heure de fin de la lecture des trames |
Début de parcelle | FrameBurstStartActive | 3 | Le signal est émis lorsque les données d'image commencent à être envoyées via le lien, et le signal n'est émis que lorsque brust> 2, ce qui est souvent inutile |
fin du dessin | FrameBurstEndActive | 4 | Lorsque les données d'image sont envoyées via le lien, le signal est émis à la fin du lien et le signal n'est émis que lorsque brust> 2, ce qui est souvent inutile |
sortie de déclenchement progressif | SoftTriggerActive | 5 | Le logiciel appelle la commande command time, la sortie, l'utilisateur peut la contrôler indépendamment |
sortie de déclenchement dur | HardTriggerActive | 6 | Lorsque le signal d'entrée de la caméra line0 \ 2 reçoit le signal d'entrée, il émet un signal de sortie |
sortie compteur | MinuterieActive | 7 | Minuterie, calcule le nombre de signaux spécifiés reçus par line0 et line2, et émet un signal de sortie |
déclencher la sortie d'attente | FrameTriggerWait | 8 | L'appareil photo peut être déclenché, et lorsque l'exposition est collectée, le signal de déclenchement |
Le démarrage de l'exposition, la sortie de déclenchement progressif et la sortie de déclenchement dur sont couramment utilisés
. Par exemple :
//参数初始化
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. Contrôle de commande d'action/ActionControl
7. Contrôle d'accès aux fichiers/FileAccessControl
8. Surveillance des événements/Contrôle des événements
8.1 Heure de fin d'exposition
9. Contrôle de bloc de données/ChunkDataControl
10. Contrôle de la couche transport / TransportLayerControl
10.1 Réglage du temps de pulsation
//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. Contrôle de jeu d'utilisateur/UserSetControl
11.1 Enregistrer les paramètres dans la caméra
Enregistrez les paramètres dans userset pour vous assurer que les paramètres ne disparaîtront pas après la mise hors tension de la caméra
//初始化部分,放在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 Restaurer les paramètres d'usine par défaut
//相机停止采集后才能调用
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);
}