当前位置:网站首页>C # joint halcon Application - Dahua Camera Collection class
C # joint halcon Application - Dahua Camera Collection class
2022-07-01 19:55:00 【123 mengno】
Dahua Camera Collection class
class Camera // Classe de caméra Dahua
{
private IDevice m_dev; /* Objet de l'appareil */
List<IGrabbedRawData> m_frameList = new List<IGrabbedRawData>(); /* Liste des caches d'images */
Thread renderThread = null; /* Afficher les fils */
bool m_bShowLoop = true; /* Variable de contrôle du fil */
Mutex m_mutex = new Mutex(); /* Verrouillage,Sécurité multithreadée garantie */
// public event Action<HObject> NewImage; // Événements d'affichage d'images
public Camera()
{
if (null == renderThread)
{
renderThread = new Thread(new ThreadStart(ShowThread));
renderThread.IsBackground = true;
renderThread.Start();
}
m_stopWatch.Start();//Le timing commence
}
/* Transcodage afficher les fils */
private void ShowThread()
{
while (m_bShowLoop)// La variable de contrôle du fil est True
{
if (m_frameList.Count == 0) //Liste des caches d'images
{
Thread.Sleep(10);
continue;
}
/* File d'attente d'images pour le dernier cadre */
m_mutex.WaitOne();//Bloquer le thread actuel, Jusqu'à ce que le signal soit reçu
IGrabbedRawData frame = m_frameList.ElementAt(0);// Renvoie l'élément à l'index spécifié dans la file d'attente
m_frameList.RemoveAt(0);
m_frameList.Clear();
m_mutex.ReleaseMutex();
/* Appel actif à la collecte des ordures */
GC.Collect();
/* Le taux d'image le plus élevé de l'affichage de contrôle est25FPS */
if (false == isTimeToDisplay())
{
continue;
}
try
{
/* L'image est transcodée enbitmapImages */
var bitmap = frame.ToBitmap(false);
// Utilisez les images acquises ici
//if (NewImage != null)
//{
// NewImage(image);
//}
}
catch
{
}
}
}
const int DEFAULT_INTERVAL = 40;// Intervalle de temps par défaut
Stopwatch m_stopWatch = new Stopwatch(); /* Compteur de temps */
/* Déterminer si l'affichage doit être effectué */
private bool isTimeToDisplay()
{
m_stopWatch.Stop();
long m_lDisplayInterval = m_stopWatch.ElapsedMilliseconds;// Obtenir le temps total mesuré par l'Instance
if (m_lDisplayInterval <= DEFAULT_INTERVAL)
{
m_stopWatch.Start();
return false;
}
else
{
m_stopWatch.Reset();
m_stopWatch.Start();
return true;
}
}
/* Rappel de la caméra allumée */
private void OnCameraOpen(object sender, EventArgs e)
{
// Enregistrez ici que la caméra est allumée
}
/* Rappel d'arrêt de la caméra */
private void OnCameraClose(object sender, EventArgs e)
{
// Enregistrez ici que la caméra est éteinte.
}
/* Rappel perdu de la caméra */
private void OnConnectLoss(object sender, EventArgs e)
{
m_dev.ShutdownGrab();
m_dev.Dispose();
m_dev = null;
}
/* Rappel des données de flux de code */
private void OnImageGrabbed(Object sender, GrabbedEventArgs e)
{
m_mutex.WaitOne();// m_mutexVerrouillage,Sécurité multithreadée garantie
m_frameList.Add(e.GrabResult.Clone());/* Liste des caches d'images */
m_mutex.ReleaseMutex();
}
/// <summary>
/// Allumez la caméra
/// </summary>
/// <returns> Une chaîne de retour vide indique une ouverture réussie , Ne pas être vide signifie que l'ouverture a échoué , Le contenu de la chaîne est une exception </returns>
/// <param name="triggerSource">Sélection de la source de déclenchement Déclenchement souple ou déclenchement externe </param>
/// <returns></returns>
public string Open(string triggerSource)
{
string sRet = string.Empty;
try
{
/* Recherche de périphériques */
List<IDeviceInfo> li = Enumerator.EnumerateDevices();
if (li.Count > 0)
{
/* Obtenir le premier appareil recherché */
m_dev = Enumerator.GetDeviceByIndex(0);
/* Enregistrer les événements liés */
m_dev.CameraOpened += OnCameraOpen;
m_dev.ConnectionLost += OnConnectLoss;
m_dev.CameraClosed += OnCameraClose;
/* Ouvrir le périphérique */
if (!m_dev.Open())
sRet = "Impossible d'allumer la caméra";
/* ParamètresTriggerSource Déclencheur souple ou externe */
m_dev.TriggerSet.Open(triggerSource);
/* Format de l'image */
using (IEnumParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImagePixelFormat])
{
p.SetValue("Mono8");
}
/* Définir le nombre de caches à 8(La valeur par défaut est16) */
m_dev.StreamGrabber.SetBufferCount(8);
/* Enregistrement des événements de rappel de flux */
m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;
/* Activer le flux de code */
if (!m_dev.GrabUsingGrabLoopThread())
sRet = " Impossible d'ouvrir le flux de code ";
}
else
{
sRet = " Appareil photo introuvable ";
}
}
catch (Exception e)
{
sRet = e.Message;
}
return sRet;
}
/// <summary>
/// Éteignez la caméra.
/// </summary>
/// <returns> La chaîne de retour vide indique un arrêt réussi , Ne pas être vide signifie que la fermeture a échoué , Le contenu de la chaîne est une exception </returns>
public string Close()
{
string sRet = String.Empty;
1 try
{
if (m_dev == null)
{
sRet = "Device is invalid";
}
m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed; /* Rappel non enregistré */
m_dev.ShutdownGrab(); /* Arrêter le flux de code */
m_dev.Close(); /* Éteignez la caméra. */
}
catch (Exception e)
{
sRet = e.Message;
}
return sRet;
}
/* Fermeture de la fenêtre */
public void OnClosed(EventArgs e)
{
if (m_dev != null)
{
m_dev.Dispose();
m_dev = null;
}
m_bShowLoop = false;
renderThread.Join();
}
/// <summary>
/// Définir le mode de déclenchement Réglage sous déclenchement souple On Tirant d'eau libre arrière (Déclenchement continu)Off(Déclencheur unique)
/// </summary>
/// <param name="value"></param>
public string SetTriggerMode(string value = "On")
{
if (m_dev == null)
{
return "Device is invalid";
}
if (!m_dev.IsOpen)
{
return " Caméra non allumée ";
}
using (IEnumParameter p = m_dev.ParameterCollection[ParametrizeNameSet.TriggerMode])
{
p.SetValue(value);
}
return "";
}
/// <summary>
/// Réglage de l'exposition
/// </summary>
/// <param name="value"></param>
public string SetExposureTime(float value)
{
if (m_dev == null)
{
return "Device is invalid";
}
if (!m_dev.IsOpen)
{
return " Caméra non allumée ";
}
double min = GetMinExposureTime();
double max = GetMaxExposureTime();
if (value < min || value > max)
{
return string.Format(" La valeur du paramètre n'est pas dans la plage ,min:{0},max:{1}", min, max);
}
using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
{
p.SetValue(value);
}
return "";
}
/// <summary>
/// Réglage du gain
/// </summary>
/// <param name="value"></param>
public string SetGainRaw(float value)
{
if (m_dev == null)
{
return "Device is invalid";
}
if (!m_dev.IsOpen)
{
return " Caméra non allumée ";
}
double min = GetMinGainRaw();
double max = GetMaxGainRaw();
if (value < min || value > max)
{
return string.Format(" La valeur du paramètre n'est pas dans la plage ,min:{0},max:{1}", min, max);
}
using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw])
{
p.SetValue(value);
}
return "";
}
/// <summary>
/// Définir la largeur de l'image
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public string SetImageWidth(int value)
{
if (m_dev == null)
{
return "Device is invalid";
}
if (!m_dev.IsOpen)
{
return " Caméra non allumée ";
}
double min = GetMinImageWidth();
double max = GetMaxImageWidth();
if (value < min || value > max)
{
return string.Format(" La valeur du paramètre n'est pas dans la plage ,min:{0},max:{1}", min, max);
}
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageWidth])
{
p.SetValue(value);
}
return "";
}
/// <summary>
/// Définir la largeur de l'image
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public string SetImageHeight(int value)
{
if (m_dev == null)
{
return "Device is invalid";
}
if (!m_dev.IsOpen)
{
return " Caméra non allumée ";
}
double min = GetMinImageHeight();
double max = GetMaxImageHeight();
if (value < min || value > max)
{
return string.Format(" La valeur du paramètre n'est pas dans la plage ,min:{0},max:{1}", min, max);
}
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageHeight])
{
p.SetValue(value);
}
return "";
}
/// <summary>
/// Définir le décalage d'image X
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public string SetImageOffsetX(int value)
{
if (m_dev == null)
{
return "Device is invalid";
}
if (!m_dev.IsOpen)
{
return " Caméra non allumée ";
}
double min = GetMinImageOffsetX();
double max = GetMaxImageOffsetX();
if (value < min || value > max)
{
return string.Format(" La valeur du paramètre n'est pas dans la plage ,min:{0},max:{1}", min, max);
}
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetX])
{
p.SetValue(value);
}
return "";
}
/// <summary>
/// Définir le décalage d'image Y
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public string SetImageOffsetY(int value)
{
if (m_dev == null)
{
return "Device is invalid";
}
if (!m_dev.IsOpen)
{
return " Caméra non allumée ";
}
double min = GetMinImageOffsetY();
double max = GetMaxImageOffsetY();
if (value < min || value > max)
{
return string.Format(" La valeur du paramètre n'est pas dans la plage ,min:{0},max:{1}", min, max);
}
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetY])
{
p.SetValue(value);
}
return "";
}
#region Obtient la plage de valeurs des paramètres de la caméra
public double GetMinExposureTime()
{
using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
{
return p.GetMinimum();
}
}
public double GetMaxExposureTime()
{
using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
{
return p.GetMaximum();
}
}
public double GetMinGainRaw()
{
using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw])
{
return p.GetMinimum();
}
}
public double GetMaxGainRaw()
{
using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw])
{
return p.GetMaximum();
}
}
public long GetMinImageWidth()
{
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageWidth])
{
return p.GetMinimum();
}
}
public long GetMaxImageWidth()
{
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageWidth])
{
return p.GetMaximum();
}
}
public long GetMinImageHeight()
{
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageHeight])
{
return p.GetMinimum();
}
}
public long GetMaxImageHeight()
{
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageHeight])
{
return p.GetMaximum();
}
}
public long GetMinImageOffsetX()
{
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetX])
{
return p.GetMinimum();
}
}
public long GetMaxImageOffsetX()
{
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetX])
{
return p.GetMaximum();
}
}
public long GetMinImageOffsetY()
{
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetY])
{
return p.GetMinimum();
}
}
public long GetMaxImageOffsetY()
{
using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetY])
{
return p.GetMaximum();
}
}
#endregion
/// <summary>
/// bitmapTransfert d'imageHObject
/// </summary>
/// <param name="bmp"></param>
/// <returns></returns>
//private HObject Bitmap2HObjectBpp24(Bitmap bmp)
//{
// HObject Hobj;
// HOperatorSet.GenEmptyObj(out Hobj);
// try
// {
// Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
// BitmapData srcBmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
// HOperatorSet.GenImageInterleaved(out Hobj, srcBmpData.Scan0, "bgr", bmp.Width, bmp.Height, 0, "byte", 0, 0, 0, 0, -1, 0);
// bmp.UnlockBits(srcBmpData);
// }
// catch (Exception e)
// {
// }
// return Hobj;
//}
}
边栏推荐
- 1592 example 1 King (sgu223 loj10170 luogu1896 increase + / provincial election -) violent thinking pressure DP 01 Backpack
- 一文读懂C语言中的结构体
- JS proxy
- 【无标题】
- 【let var const】
- Win11快捷键切换输入法无反应怎么办?快捷键切换输入法没有反应
- CMU AI PhD first year summary
- js三元表达式复杂条件判断
- DS Transunet:用于医学图像分割的双Swin-Transformer U-Net
- Arduino Stepper库驱动28BYJ-48步进电机测试程序
猜你喜欢
![[research data] observation on the differences of health preservation concepts among people in 2022 - Download attached](/img/50/926cc5bce83f8b195b3e2072b656bf.jpg)
[research data] observation on the differences of health preservation concepts among people in 2022 - Download attached

How to use console Log print text?

Solve the problem of slow or failed vscode download

Bind this of the current scope for callback functions in other cases such as timers and delayers

SQL 入门计划-1-选择

GC垃圾回收
![[untitled]](/img/6c/df2ebb3e39d1e47b8dd74cfdddbb06.gif)
[untitled]

使用Zadig从0到1搭建持续交付平台

JS的Proxy

Servlet knowledge points
随机推荐
【C语言】详解 memset() 函数用法
Difference between redo and undo
How to add transactions in JDBC
强大、好用、适合程序员/软件开发者的专业编辑器/笔记软件综合评测和全面推荐
为定时器和延时器等其它情况的回调函数绑定当前作用域的this
Bao, what if the O & M 100+ server is a headache? Use Xingyun housekeeper!
DS transunet: Dual Swing transformer u-net for medical image segmentation
STC 32位8051单片机开发实例教程 三 程序编译设置与下载
STC 32位8051单片机开发实例教程 二 I/O工作模式及其配置
再回顾集合容器
P2433 [deep foundation 1-2] primary school mathematics n in one
EasyCVR通过国标GB28181协议接入设备,出现设备自动拉流是什么原因?
[research materials] Huawei Technology ICT 2021: at the beginning of the "Yuan" year, the industry is "new" -- download attached
DDR4 test-2
2022/5/23-2022/5/30
Win11暂停更新点不了怎么办?Win11暂停更新是灰色的如何解决?
Servlet knowledge points
Redis installation and startup in Windows environment (background startup)
HLS4ML/vivado HLS 报错解决方案
1592 例题1 国王(Sgu223 LOJ10170 LUOGU1896 提高+/省选-) 暴力思考 状压DP 01背包