当前位置:网站首页>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;
//}
}
边栏推荐
- Graduation season | Huawei experts teach the interview secret: how to get a high paying offer from a large factory?
- Regular expression =regex=regular expression
- Test self-study people must see: how to find test items in software testing?
- AAAI2020: Real-time Scene Text Detection with Differentiable Binarization
- 【let var const】
- Hls4ml reports an error the board_ part definition was not found for tul. com. tw:pynq-z2:part0:1.0.
- Optimization of video streaming with repeated requests in the case of unstable easygbs network
- Win11快捷键切换输入法无反应怎么办?快捷键切换输入法没有反应
- 对象的创建
- windows环境 redis安装和启动(后台启动)
猜你喜欢
解决VSCode下载慢或下载失败的问题
Hls4ml reports an error the board_ part definition was not found for tul. com. tw:pynq-z2:part0:1.0.
3D全景模型展示可视化技术演示
Arduino Stepper库驱动28BYJ-48步进电机测试程序
通过js实现金字塔(星号金字塔,回文对称数字金字塔)
振弦采集模块测量振弦传感器的流程步骤
再回顾集合容器
产品模块化设计的前世今生
HLS4ML报错The board_part definition was not found for tul.com.tw:pynq-z2:part0:1.0.
开发那些事儿:EasyCVR平台添加播放地址鉴权功能
随机推荐
JS的Proxy
How to add transactions in JDBC
今日群里分享的面试题
How can a programmer grow rapidly
P2433 【深基1-2】小学数学 N 合一
Bao, what if the O & M 100+ server is a headache? Use Xingyun housekeeper!
1592 例题1 国王(Sgu223 LOJ10170 LUOGU1896 提高+/省选-) 暴力思考 状压DP 01背包
振弦采集模块测量振弦传感器的流程步骤
P2433 [deep foundation 1-2] primary school mathematics n in one
实例讲解将Graph Explorer搬上JupyterLab
SwiftUI 4 新功能大全之 Toggle与 Mixed Toggle 多个绑定组件
面试题篇一
Difference between redo and undo
Arduino Stepper库驱动28BYJ-48步进电机测试程序
GC garbage collection
HLS4ML进入方法
Time series analysis using kibana timelion
为定时器和延时器等其它情况的回调函数绑定当前作用域的this
新窗口打开页面-window.open
Win11暂停更新点不了怎么办?Win11暂停更新是灰色的如何解决?