335 lines
13 KiB
C#
335 lines
13 KiB
C#
/*
|
|
* Copyright (c) 2025 LG Electronics Inc.
|
|
* SPDX-License-Identifier: LicenseRef-LGE-Proprietary
|
|
*/
|
|
using Aurora.Api;
|
|
using Aurora.Api.DataType;
|
|
using Aurora.Api.Devices;
|
|
using Hermes;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace VisionCommon {
|
|
public abstract class CameraBase : Aurora.Api.Device {
|
|
protected Logger LOG { get; set; }
|
|
protected CamConfig CamConfig { get; set; }
|
|
protected TactTimeChecker TactTimeChecker { get; set; }
|
|
|
|
#region For Realloc Image Buffer
|
|
protected double OldRatioX { get; set; } = 1; // 카메라 재연결시 이미지 Crop이 발생했는지 체크하기 위함
|
|
protected double OldRatioY { get; set; } = 1;
|
|
protected eImageRotation OldRotationType { get; set; } = eImageRotation.None; // 카메라 재연결시 이미지 회전이 발생했는지 체크하기 위함
|
|
#endregion
|
|
|
|
protected readonly object LockThis = new object();
|
|
protected readonly object LockThis_Hook = new object();
|
|
protected readonly object LockThis_Hook_ExtTrig = new object();
|
|
protected readonly object _LiveLock = new object();
|
|
|
|
private bool _isLiveOn = false;
|
|
|
|
/// <summary>
|
|
/// 외부(버퍼) 트리거에 의한 그랩 완료 여부 (True : 그랩 완료 / False : 그랩 미완료)
|
|
/// </summary>
|
|
private bool _HookCompletedByExtTrig = false;
|
|
|
|
/// <summary>
|
|
/// EventCallBack에 의한 그랩 완료 여부 (True : 그랩 완료 / False : 그랩 미완료)
|
|
/// </summary>
|
|
private bool _HookCompleted = false;
|
|
|
|
protected CameraBase(string deviceId) {
|
|
Type = DeviceType.Camera;
|
|
DeviceId = deviceId;
|
|
CamConfig = CamConfig.GetDefaultConfig() as CamConfig;
|
|
}
|
|
|
|
protected void CheckImageBufferRotationChanged() {
|
|
if (OldRatioX != CamConfig.ImageSizeRatioX ||
|
|
OldRatioY != CamConfig.ImageSizeRatioY ||
|
|
OldRotationType != CamConfig.FlipAndRotation.ImageRotation) {
|
|
|
|
OldRatioX = CamConfig.ImageSizeRatioX;
|
|
OldRatioY = CamConfig.ImageSizeRatioY;
|
|
OldRotationType = CamConfig.FlipAndRotation.ImageRotation;
|
|
|
|
VisionEnv.AuroraEnv.EventPublisher.Publish(
|
|
new EventMessage(DeviceId, VisionEventId.UPDATE_GRAB_IMAGE_BUFFER));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 카메라 화면 중심을 기준으로 Ratio X,Y를 적용한 자를 이미지 크기
|
|
/// </summary>
|
|
/// <returns>자를 이미지 크기</returns>
|
|
public ROI GetCropRoi() {
|
|
var cropRoi = new ROI();
|
|
if (IpAdapter.Instance.IpEnvironment.IsHeightLongerThanWidth(CamConfig)) {
|
|
cropRoi.CenterX = CamConfig.ImageSize.Height * 0.5;
|
|
cropRoi.CenterY = CamConfig.ImageSize.Width * 0.5;
|
|
cropRoi.Width = (int)(CamConfig.ImageSize.Height * CamConfig.ImageSizeRatioY);
|
|
cropRoi.Height = (int)(CamConfig.ImageSize.Width * CamConfig.ImageSizeRatioX);
|
|
}
|
|
else {
|
|
cropRoi.CenterX = CamConfig.ImageSize.Width * 0.5;
|
|
cropRoi.CenterY = CamConfig.ImageSize.Height * 0.5;
|
|
cropRoi.Width = (int)(CamConfig.ImageSize.Width * CamConfig.ImageSizeRatioX);
|
|
cropRoi.Height = (int)(CamConfig.ImageSize.Height * CamConfig.ImageSizeRatioY);
|
|
}
|
|
return cropRoi;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 외부(버퍼) 트리거에 의한 그랩 완료 여부 설정
|
|
/// </summary>
|
|
/// <param name="hookCompletedByExtTrig">그랩 완료 여부</param>
|
|
public void SetHookCompletedByExtTrig(bool hookCompletedByExtTrig) {
|
|
lock (LockThis_Hook_ExtTrig) {
|
|
_HookCompletedByExtTrig = hookCompletedByExtTrig;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 외부(버퍼) 트리거에 의한 그랩 완료 여부 체크 (True : 그랩 완료 / False : 그랩 미완료)
|
|
/// </summary>
|
|
/// <returns>그랩 완료 여부/returns>
|
|
public bool IsHookCompletedByExtTrig() {
|
|
lock (LockThis_Hook_ExtTrig) {
|
|
return _HookCompletedByExtTrig;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// EventCallBack에 의한 그랩 완료 여부 설정
|
|
/// </summary>
|
|
/// <param name="hookCompleted">그랩 완료 여부</param>
|
|
public void SetHookCompleted(bool hookCompleted) {
|
|
lock (LockThis_Hook) {
|
|
_HookCompleted = hookCompleted;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// EventCallBack에 의한 그랩 완료 여부 체크 (True : 그랩 완료 / False : 그랩 미완료)
|
|
/// </summary>
|
|
/// <returns>그랩 완료 여부</returns>
|
|
public bool IsHookCompleted() {
|
|
lock (LockThis_Hook) {
|
|
return _HookCompleted;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 라이브 켜져있는지 여부
|
|
/// </summary>
|
|
/// <returns>라이브 여부</returns>
|
|
public bool IsLiveOn() {
|
|
lock (_LiveLock) {
|
|
return _isLiveOn;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 카메라 라이브 시키기
|
|
/// </summary>
|
|
protected void LiveOn() {
|
|
lock (_LiveLock) {
|
|
_isLiveOn = true;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 카메라 라이브 끄기
|
|
/// </summary>
|
|
protected void LiveOff() {
|
|
lock (_LiveLock) {
|
|
_isLiveOn = false;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 연결되어있는지 여부
|
|
/// </summary>
|
|
/// <returns>연결여부</returns>
|
|
public abstract bool IsConnected();
|
|
/// <summary>
|
|
/// 이미지 버퍼 복제
|
|
/// </summary>
|
|
/// <returns>복제한 이미지버퍼</returns>
|
|
public abstract object CloneImageBuffer();
|
|
/// <summary>
|
|
/// 카메라 디스플레이 가져오기
|
|
/// </summary>
|
|
/// <returns>카메라 디스플레이</returns>
|
|
public abstract ICameraDisplay GetDisplay();
|
|
/// <summary>
|
|
/// 디스플레이 설정하기
|
|
/// </summary>
|
|
/// <param name="cameraDisplay">카메라 디스플레이</param>
|
|
public abstract void SetDisplay(ICameraDisplay cameraDisplay);
|
|
/// <summary>
|
|
/// 디스플레이로 부터 이미지 가져오기
|
|
/// </summary>
|
|
/// <param name="cameraDisplay">가져올 카메라 디스플레이</param>
|
|
/// <returns>이미지 객체</returns>
|
|
public abstract object GetImageFromDisplay(ICameraDisplay cameraDisplay);
|
|
/// <summary>
|
|
/// 게인 값 가져오기
|
|
/// </summary>
|
|
/// <returns>성공유무</returns>
|
|
public abstract int GetGain();
|
|
/// <summary>
|
|
/// 게인 값 설정하기
|
|
/// </summary>
|
|
/// <param name="gain">설정할 게인 값</param>
|
|
/// <returns>성공유무</returns>
|
|
public abstract int SetGain(int gain);
|
|
/// <summary>
|
|
/// 노출도 값 가져오기
|
|
/// </summary>
|
|
/// <returns>노출 값</returns>
|
|
public abstract double GetExposure();
|
|
/// <summary>
|
|
/// 노출도 최솟값 가져오기
|
|
/// </summary>
|
|
/// <returns>노출도 최솟값</returns>
|
|
public abstract double GetMinExposure();
|
|
/// <summary>
|
|
/// 노출도 최댓값 가져오기
|
|
/// </summary>
|
|
/// <returns>노출도 최댓값</returns>
|
|
public abstract double GetMaxExposure();
|
|
/// <summary>
|
|
/// 노출 값 설정하기
|
|
/// </summary>
|
|
/// <param name="exposureTime_ms">노출시간(ms)기준</param>
|
|
/// <returns>성공유무</returns>
|
|
public abstract int SetExposure(double exposureTime_ms);
|
|
|
|
/// <summary>
|
|
/// 이미지 반전 & 회전 Config 갱신
|
|
/// </summary>
|
|
/// <param name="flipAndRotation">이미지 반전 & 회전 Config</param>
|
|
/// <returns>성공 유무</returns>
|
|
public abstract int ResetFlipAndRotation(FlipAndRotation flipAndRotation);
|
|
/// <summary>
|
|
/// 이미지 사이즈 가져오기
|
|
/// </summary>
|
|
/// <returns>이미지 사이즈</returns>
|
|
public abstract ImageSize GetImageSize();
|
|
/// <summary>
|
|
/// 버퍼로 부터 그랩한 이미지 가져오기
|
|
/// </summary>
|
|
/// <param name="cameraDisplay">카메라 디스플레이</param>
|
|
/// <param name="image">가져올 이미지 (reference)</param>
|
|
/// <returns>성공유무</returns>
|
|
public abstract int GetGrabImageFromBuffer(ICameraDisplay cameraDisplay, ref object image);
|
|
/// <summary>
|
|
/// 카메라 그랩(동기)
|
|
/// </summary>
|
|
/// <param name="cameraDisplay">카메라 디스플레이</param>
|
|
/// <param name="image">가져올 이미지 (reference)</param>
|
|
/// <returns>성공 유무</returns>
|
|
public abstract int GrabSync(ICameraDisplay cameraDisplay, ref object image);
|
|
/// <summary>
|
|
/// 라이브 시작
|
|
/// </summary>
|
|
/// <param name="cameraDisplay">카메라 디스플레이</param>
|
|
public abstract void StartLive(ICameraDisplay cameraDisplay);
|
|
/// <summary>
|
|
/// 라이브 정지
|
|
/// </summary>
|
|
public abstract void StopLive();
|
|
/// <summary>
|
|
/// Child 이미지들로 Parent(원장) 이미지가 정상적으로 만들어지는지 검증
|
|
/// </summary>
|
|
/// <param name="cameraDisplay">디스플레이</param>
|
|
/// <param name="image">원장(부모) 이미지</param>
|
|
/// <returns>성공 유무</returns>
|
|
public abstract int VerifyChildImage(ICameraDisplay cameraDisplay, ref object image);
|
|
|
|
#region For Flying
|
|
protected object[] _ProcImages; // 플라잉 혹은 HW트리거 공정 이미지 배열
|
|
protected object _ParentImage; // Child 이미지를 조합한 부모 버퍼 (원장 이미지)
|
|
protected bool _IsFlyingRunning; // 플라잉 상태 체크
|
|
protected int _FlyingIdx = 0; // 플라잉 인덱스
|
|
|
|
/// <summary>
|
|
/// 플라잉 시작
|
|
/// </summary>
|
|
/// <param name="fovInfo">FOV 정보</param>
|
|
/// <param name="param">추가 파라미터</param>
|
|
/// <returns>성공 유무</returns>
|
|
public abstract int StartFlying(FovInfo fovInfo, object param = null);
|
|
/// <summary>
|
|
/// 플라잉 종료
|
|
/// </summary>
|
|
/// <param name="param">추가 파라미터</param>
|
|
/// <returns>성공 유무</returns>
|
|
public abstract int StopFlying(object param = null);
|
|
|
|
/// <summary>
|
|
/// 플라잉 상태 체크
|
|
/// </summary>
|
|
/// <returns>성공 유무</returns>
|
|
public bool IsFlyingRunning() {
|
|
return _IsFlyingRunning;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 현재 플라잉 인덱스 가져오기
|
|
/// </summary>
|
|
/// <returns>현재 플라잉 인덱스</returns>
|
|
public int GetCurrentFlyingIdx() {
|
|
return _FlyingIdx;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 플라잉 이미지 가져오기
|
|
/// </summary>
|
|
/// <param name="flyingIdx">플라잉 인덱스</param>
|
|
/// <returns>플라잉 이미지</returns>
|
|
public object GetFlyingImage(int flyingIdx) {
|
|
try {
|
|
if (_ProcImages.Length > flyingIdx) {
|
|
return _ProcImages[flyingIdx];
|
|
}
|
|
LOG.FuncE("flyingIdx exceeds _ProcImages array bounds.");
|
|
}
|
|
catch (Exception e) {
|
|
LOG.FuncE(e.Message);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 플라잉 이미지 전체 가져오기
|
|
/// </summary>
|
|
/// <returns>플라잉 이미지 전체</returns>
|
|
public object[] GetFlyingImages() {
|
|
try {
|
|
var flyingImages = new object[_ProcImages.Length];
|
|
for (int i = 0; i < _ProcImages.Length; i++) {
|
|
flyingImages[i] = _ProcImages[i];
|
|
}
|
|
return flyingImages;
|
|
}
|
|
catch (Exception e) {
|
|
LOG.FuncE(e.Message);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 플라잉 합성(원장) 이미지 가져오기. *원장 : Child 이미지를 조합하여 한 장으로 만듬
|
|
/// </summary>
|
|
/// <returns>플라잉 합성(원장) 이미지</returns>
|
|
public object GetParentImage() {
|
|
return _ParentImage;
|
|
}
|
|
#endregion
|
|
}
|
|
} |