Commit 6c799b94 by liulongfei

1. 中心轴添加水平和垂直设置

parent f9e08c84
...@@ -212,6 +212,7 @@ ...@@ -212,6 +212,7 @@
<Compile Include="VideoControl\Control\Plugin\CenterAxis\CenterAxisPlugin.cs" /> <Compile Include="VideoControl\Control\Plugin\CenterAxis\CenterAxisPlugin.cs" />
<Compile Include="VideoControl\Control\Plugin\CenterAxis\CenterAxisPluginExpand.cs" /> <Compile Include="VideoControl\Control\Plugin\CenterAxis\CenterAxisPluginExpand.cs" />
<Compile Include="VideoControl\Control\Plugin\CenterAxis\Info\CenterAxisInfo.cs" /> <Compile Include="VideoControl\Control\Plugin\CenterAxis\Info\CenterAxisInfo.cs" />
<Compile Include="VideoControl\Control\Plugin\CenterAxis\Info\CenterAxisType.cs" />
<Compile Include="VideoControl\Control\Plugin\ManualCorrection\EventArgs\ManualCorrectionClickEventArgs.cs" /> <Compile Include="VideoControl\Control\Plugin\ManualCorrection\EventArgs\ManualCorrectionClickEventArgs.cs" />
<Compile Include="VideoControl\Control\Plugin\ManualCorrection\ManualCorrectionExpand.cs" /> <Compile Include="VideoControl\Control\Plugin\ManualCorrection\ManualCorrectionExpand.cs" />
<Compile Include="VideoControl\Control\Plugin\ManualCorrection\Info\ManualCorrectionInfo.cs" /> <Compile Include="VideoControl\Control\Plugin\ManualCorrection\Info\ManualCorrectionInfo.cs" />
...@@ -274,11 +275,9 @@ ...@@ -274,11 +275,9 @@
<Compile Include="VideoControl\Stream\NDI\Task\NDIStreamExecuteVideoTask.cs" /> <Compile Include="VideoControl\Stream\NDI\Task\NDIStreamExecuteVideoTask.cs" />
<Compile Include="VideoControl\Stream\NDI\Task\NDIStreamFindStreamTask.cs" /> <Compile Include="VideoControl\Stream\NDI\Task\NDIStreamFindStreamTask.cs" />
<Compile Include="VideoControl\Stream\NDI\Task\NDIStreamRecvVideoTask.cs" /> <Compile Include="VideoControl\Stream\NDI\Task\NDIStreamRecvVideoTask.cs" />
<Compile Include="VideoControl\Stream\OpenCV\OpenCVPropertyInfos.cs" />
<Compile Include="VideoControl\Stream\OpenCV\OpenCVStreamTaskNames.cs" /> <Compile Include="VideoControl\Stream\OpenCV\OpenCVStreamTaskNames.cs" />
<Compile Include="VideoControl\Stream\OpenCV\OpenCVStream.cs" /> <Compile Include="VideoControl\Stream\OpenCV\OpenCVStream.cs" />
<Compile Include="VideoControl\Stream\OpenCV\OpenCVStreamOption.cs" /> <Compile Include="VideoControl\Stream\OpenCV\OpenCVStreamOption.cs" />
<Compile Include="VideoControl\Stream\OpenCV\OpenCVStreamStatus.cs" />
<Compile Include="VideoControl\Stream\OpenCV\OpenCVStreamTaskBase.cs" /> <Compile Include="VideoControl\Stream\OpenCV\OpenCVStreamTaskBase.cs" />
<Compile Include="VideoControl\Stream\OpenCV\OpenCVStreeamVideoFrame.cs" /> <Compile Include="VideoControl\Stream\OpenCV\OpenCVStreeamVideoFrame.cs" />
<Compile Include="VideoControl\Stream\OpenCV\Task\OpenCVStreamExecuteVideoTask.cs" /> <Compile Include="VideoControl\Stream\OpenCV\Task\OpenCVStreamExecuteVideoTask.cs" />
......
...@@ -63,14 +63,20 @@ namespace VIZ.Framework.Common ...@@ -63,14 +63,20 @@ namespace VIZ.Framework.Common
SolidColorBrush brush = new SolidColorBrush(context.Target, info.AxisColor); SolidColorBrush brush = new SolidColorBrush(context.Target, info.AxisColor);
// X轴 // X轴
if (info.AxisType == CenterAxisType.All || info.AxisType == CenterAxisType.Horizontal)
{
RawVector2 x1 = new RawVector2((float)context.VideoRenderInfo.DrawingRect.Left, drawCenter.Y); RawVector2 x1 = new RawVector2((float)context.VideoRenderInfo.DrawingRect.Left, drawCenter.Y);
RawVector2 x2 = new RawVector2((float)context.VideoRenderInfo.DrawingRect.Right, drawCenter.Y); RawVector2 x2 = new RawVector2((float)context.VideoRenderInfo.DrawingRect.Right, drawCenter.Y);
context.Target.DrawLine(x1, x2, brush, (float)info.AxisWidth); context.Target.DrawLine(x1, x2, brush, (float)info.AxisWidth);
}
// Y轴 // Y轴
if (info.AxisType == CenterAxisType.All || info.AxisType == CenterAxisType.Vertical)
{
RawVector2 y1 = new RawVector2(drawCenter.X, (float)context.VideoRenderInfo.DrawingRect.Top); RawVector2 y1 = new RawVector2(drawCenter.X, (float)context.VideoRenderInfo.DrawingRect.Top);
RawVector2 y2 = new RawVector2(drawCenter.X, (float)context.VideoRenderInfo.DrawingRect.Bottom); RawVector2 y2 = new RawVector2(drawCenter.X, (float)context.VideoRenderInfo.DrawingRect.Bottom);
context.Target.DrawLine(y1, y2, brush, (float)info.AxisWidth); context.Target.DrawLine(y1, y2, brush, (float)info.AxisWidth);
} }
} }
}
} }
\ No newline at end of file
...@@ -26,5 +26,10 @@ namespace VIZ.Framework.Common ...@@ -26,5 +26,10 @@ namespace VIZ.Framework.Common
/// 轴颜色 /// 轴颜色
/// </summary> /// </summary>
public RawColor4 AxisColor { get; set; } public RawColor4 AxisColor { get; set; }
/// <summary>
/// 安全轴类型
/// </summary>
public CenterAxisType AxisType { get; set; } = CenterAxisType.All;
} }
} }
...@@ -7,28 +7,23 @@ using System.Threading.Tasks; ...@@ -7,28 +7,23 @@ using System.Threading.Tasks;
namespace VIZ.Framework.Common namespace VIZ.Framework.Common
{ {
/// <summary> /// <summary>
/// OpenCV属性信息 /// 中心轴类型
/// </summary> /// </summary>
public class OpenCVPropertyInfos public enum CenterAxisType
{ {
/// <summary> /// <summary>
/// Fps /// 水平
/// </summary> /// </summary>
public double Fps { get; internal set; } Horizontal,
/// <summary> /// <summary>
/// 帧宽度 /// 垂直
/// </summary> /// </summary>
public double FrameWidth { get; internal set; } Vertical,
/// <summary> /// <summary>
/// 帧高度 /// 水平和垂直
/// </summary> /// </summary>
public double FrameHeight { get; internal set; } All
/// <summary>
/// 帧数
/// </summary>
public double FrameCount { get; internal set; }
} }
} }
...@@ -57,6 +57,15 @@ namespace VIZ.Framework.Common ...@@ -57,6 +57,15 @@ namespace VIZ.Framework.Common
} }
/// <summary> /// <summary>
/// 获取跟踪数据
/// </summary>
/// <returns>跟踪数据</returns>
public List<TrackingBoxInfo> GetTrackingBoxInfos()
{
return this.trackingBoxInfos;
}
/// <summary>
/// 渲染 /// 渲染
/// </summary> /// </summary>
/// <param name="context">渲染上下文</param> /// <param name="context">渲染上下文</param>
......
...@@ -29,11 +29,6 @@ namespace VIZ.Framework.Common ...@@ -29,11 +29,6 @@ namespace VIZ.Framework.Common
int Length { get; set; } int Length { get; set; }
/// <summary> /// <summary>
/// 是否是最后一帧
/// </summary>
bool IsEnd { get; set; }
/// <summary>
/// 画面数据 /// 画面数据
/// </summary> /// </summary>
DataStream DataStream { get; set; } DataStream DataStream { get; set; }
......
...@@ -7,6 +7,7 @@ using System.Linq; ...@@ -7,6 +7,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using log4net; using log4net;
using NewTek;
namespace VIZ.Framework.Common namespace VIZ.Framework.Common
{ {
...@@ -23,9 +24,12 @@ namespace VIZ.Framework.Common ...@@ -23,9 +24,12 @@ namespace VIZ.Framework.Common
/// <summary> /// <summary>
/// OpenCv流 /// OpenCv流
/// </summary> /// </summary>
/// <param name="index">设备索引</param>
/// <param name="option">设置</param> /// <param name="option">设置</param>
public OpenCVStream(OpenCVStreamOption option) : base(option) public OpenCVStream(int index, OpenCVStreamOption option) : base(option)
{ {
this.Index = index;
this.TaskDic.Add(OpenCVStreamTaskNames.RECV_VIDEO, new OpenCVStreamRecvVideoTask(this)); this.TaskDic.Add(OpenCVStreamTaskNames.RECV_VIDEO, new OpenCVStreamRecvVideoTask(this));
this.TaskDic.Add(OpenCVStreamTaskNames.EXECUTE_VIDEO, new OpenCVStreamExecuteVideoTask(this)); this.TaskDic.Add(OpenCVStreamTaskNames.EXECUTE_VIDEO, new OpenCVStreamExecuteVideoTask(this));
} }
...@@ -35,19 +39,9 @@ namespace VIZ.Framework.Common ...@@ -35,19 +39,9 @@ namespace VIZ.Framework.Common
/* ========================================================================================================= */ /* ========================================================================================================= */
/// <summary> /// <summary>
/// 地址 /// 设备索引
/// </summary>
public string Uri { get; private set; }
/// <summary>
/// 属性信息
/// </summary>
public OpenCVPropertyInfos PropertyInfos { get; private set; }
/// <summary>
/// 状态
/// </summary> /// </summary>
public OpenCVStreamStatus Status { get; private set; } public int Index { get; private set; }
/* ========================================================================================================= */ /* ========================================================================================================= */
/* === Internal Field === */ /* === Internal Field === */
...@@ -58,11 +52,6 @@ namespace VIZ.Framework.Common ...@@ -58,11 +52,6 @@ namespace VIZ.Framework.Common
/// </summary> /// </summary>
internal VideoCapture VideoCapture; internal VideoCapture VideoCapture;
/// <summary>
/// 读取帧锁对象
/// </summary>
internal object read_frame_lock_object = new object();
/* ========================================================================================================= */ /* ========================================================================================================= */
/* === Field === */ /* === Field === */
/* ========================================================================================================= */ /* ========================================================================================================= */
...@@ -77,41 +66,16 @@ namespace VIZ.Framework.Common ...@@ -77,41 +66,16 @@ namespace VIZ.Framework.Common
/* ========================================================================================================= */ /* ========================================================================================================= */
/// <summary> /// <summary>
/// 播放 /// 开始
/// </summary>
public void Play()
{
if (this.Status == OpenCVStreamStatus.None || this.Status == OpenCVStreamStatus.Play)
return;
double frame = this.VideoCapture.Get(VideoCaptureProperties.PosFrames);
if (frame >= this.PropertyInfos.FrameCount)
{
this.Stop();
}
foreach (var task in this.TaskDic.Values)
{
task.Start();
}
this.Status = OpenCVStreamStatus.Play;
}
/// <summary>
/// 暂停
/// </summary> /// </summary>
public void Pause() public void Start()
{ {
if (this.Status == OpenCVStreamStatus.None || this.Status == OpenCVStreamStatus.Stop) this.VideoCapture = new VideoCapture(this.Index);
return;
foreach (var task in this.TaskDic.Values) // 启动OpenCV视频帧接收任务
{ this.TaskDic[OpenCVStreamTaskNames.RECV_VIDEO].Start();
task.Stop(); // 启动OpenCV视频帧处理任务
} this.TaskDic[OpenCVStreamTaskNames.EXECUTE_VIDEO].Start();
this.Status = OpenCVStreamStatus.Pause;
} }
/// <summary> /// <summary>
...@@ -119,125 +83,11 @@ namespace VIZ.Framework.Common ...@@ -119,125 +83,11 @@ namespace VIZ.Framework.Common
/// </summary> /// </summary>
public void Stop() public void Stop()
{ {
if (this.Status == OpenCVStreamStatus.None) // 停止所有任务
return;
foreach (var task in this.TaskDic.Values) foreach (var task in this.TaskDic.Values)
{ {
task.Stop(); task.Stop();
} }
this.VideoCapture.Set(VideoCaptureProperties.PosFrames, 0);
this.TriggerExecuteBlackVideoFrame();
this.Status = OpenCVStreamStatus.Stop;
}
/// <summary>
/// 设置位置
/// </summary>
/// <param name="position">帧位置</param>
public void SetPosition(int position)
{
if (this.Status == OpenCVStreamStatus.None)
return;
lock (this.read_frame_lock_object)
{
this.VideoCapture.Set(VideoCaptureProperties.PosFrames, position);
while (this.VideoFrameQueue.Count > 0)
{
if (this.VideoFrameQueue.TryDequeue(out IVideoFrame frame))
{
frame.Dispose();
}
}
}
}
/// <summary>
/// 切换源
/// </summary>
/// <param name="uri">源</param>
public void ChangeUri(string uri)
{
this.Stop();
this.Uri = uri;
this.VideoCapture?.Dispose();
this.VideoCapture = null;
if (string.IsNullOrWhiteSpace(uri))
{
this.Status = OpenCVStreamStatus.None;
this.PropertyInfos = null;
return;
}
try
{
this.VideoCapture = new VideoCapture(this.Uri);
this.InitPropertyInfos();
}
catch (Exception ex)
{
log.Error(ex);
this.Status = OpenCVStreamStatus.None;
this.PropertyInfos = null;
}
this.Status = OpenCVStreamStatus.Stop;
}
/// <summary>
/// 触发执行黑色帧
/// </summary>
public void TriggerExecuteBlackVideoFrame()
{
OpenCVStreeamVideoFrame frame = new OpenCVStreeamVideoFrame(Scalar.Black);
this.TriggerExecuteVideoFrame(frame);
}
/// <summary>
/// 触发执行第一帧
/// </summary>
public void TriggerExecuteCurrentPosVideoFrame()
{
if (this.Status == OpenCVStreamStatus.None)
return;
OpenCVStreeamVideoFrame videoFrame = new OpenCVStreeamVideoFrame();
lock (this.read_frame_lock_object)
{
Mat src = new Mat();
Mat mat = new Mat();
if (!this.VideoCapture.Read(src))
{
src.Dispose();
return;
}
Cv2.CvtColor(src, mat, ColorConversionCodes.BGR2BGRA);
videoFrame.Width = mat.Width;
videoFrame.Height = mat.Height;
videoFrame.Length = mat.Width * mat.Height * 4;
videoFrame.TimeStamp = TimeSpan.FromMilliseconds(this.VideoCapture.PosMsec).Ticks;
videoFrame.DataStream = new SharpDX.DataStream(videoFrame.Length, true, true);
unsafe
{
Buffer.MemoryCopy(mat.DataPointer, videoFrame.DataStream.DataPointer.ToPointer(), videoFrame.Length, videoFrame.Length);
}
src.Dispose();
mat.Dispose();
}
this.TriggerExecuteVideoFrame(videoFrame);
} }
/// <summary> /// <summary>
...@@ -261,24 +111,5 @@ namespace VIZ.Framework.Common ...@@ -261,24 +111,5 @@ namespace VIZ.Framework.Common
/* === Private Function === */ /* === Private Function === */
/* ========================================================================================================= */ /* ========================================================================================================= */
/// <summary>
/// 初始化属性信息
/// </summary>
private void InitPropertyInfos()
{
OpenCVPropertyInfos infos = new OpenCVPropertyInfos();
// FPS
infos.Fps = this.VideoCapture.Get(VideoCaptureProperties.Fps);
// 帧宽度
infos.FrameWidth = this.VideoCapture.Get(VideoCaptureProperties.FrameWidth);
// 帧高度
infos.FrameHeight = this.VideoCapture.Get(VideoCaptureProperties.FrameHeight);
// 帧数量
infos.FrameCount = this.VideoCapture.Get(VideoCaptureProperties.FrameCount);
this.PropertyInfos = infos;
}
} }
} }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace VIZ.Framework.Common
{
/// <summary>
/// OpenCV流状态
/// </summary>
public enum OpenCVStreamStatus
{
/// <summary>
/// 未指定,不可用
/// </summary>
None,
/// <summary>
/// 播放状态
/// </summary>
Play,
/// <summary>
/// 暂停状态
/// </summary>
Pause,
/// <summary>
/// 停止状态
/// </summary>
Stop
}
}
...@@ -11,6 +11,7 @@ using System.Drawing; ...@@ -11,6 +11,7 @@ using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using OpenCvSharp; using OpenCvSharp;
using System.Diagnostics; using System.Diagnostics;
using log4net;
namespace VIZ.Framework.Common namespace VIZ.Framework.Common
{ {
...@@ -29,46 +30,37 @@ namespace VIZ.Framework.Common ...@@ -29,46 +30,37 @@ namespace VIZ.Framework.Common
} }
/// <summary> /// <summary>
/// 任务名称 /// 日志
/// </summary> /// </summary>
public override OpenCVStreamTaskNames Name => OpenCVStreamTaskNames.RECV_VIDEO; private readonly static ILog log = LogManager.GetLogger(typeof(OpenCVStreamRecvVideoTask));
/// <summary> /// <summary>
/// 计时器 /// 任务名称
/// </summary> /// </summary>
private readonly Stopwatch renderTimer = new Stopwatch(); public override OpenCVStreamTaskNames Name => OpenCVStreamTaskNames.RECV_VIDEO;
/// <summary> /// <summary>
/// 执行 /// 执行
/// </summary> /// </summary>
protected override void Execute() protected override void Execute()
{ {
while (this.IsStarted) try
{ {
long begin = this.renderTimer.ElapsedMilliseconds; while (this.IsStarted)
this.renderTimer.Start();
lock (this.Stream.read_frame_lock_object)
{ {
// 处理一帧
this.ExecuteOne(); this.ExecuteOne();
} }
this.renderTimer.Stop();
long end = this.renderTimer.ElapsedMilliseconds;
int wait = (int)((1000d / this.Stream.PropertyInfos.Fps) - (end - begin));
if (wait > 0)
{
Thread.Sleep(wait);
} }
catch (Exception ex)
{
log.Error(ex);
} }
} }
/// <summary> /// <summary>
/// 执行一帧 /// 执行一帧
/// </summary> /// </summary>
public void ExecuteOne() private void ExecuteOne()
{ {
Mat src = new Mat(); Mat src = new Mat();
Mat mat = new Mat(); Mat mat = new Mat();
...@@ -87,7 +79,6 @@ namespace VIZ.Framework.Common ...@@ -87,7 +79,6 @@ namespace VIZ.Framework.Common
videoFrame.Length = mat.Width * mat.Height * 4; videoFrame.Length = mat.Width * mat.Height * 4;
videoFrame.TimeStamp = TimeSpan.FromMilliseconds(this.Stream.VideoCapture.PosMsec).Ticks; videoFrame.TimeStamp = TimeSpan.FromMilliseconds(this.Stream.VideoCapture.PosMsec).Ticks;
videoFrame.DataStream = new SharpDX.DataStream(videoFrame.Length, true, true); videoFrame.DataStream = new SharpDX.DataStream(videoFrame.Length, true, true);
videoFrame.IsEnd = this.Stream.VideoCapture.PosFrames == this.Stream.PropertyInfos.FrameCount;
unsafe unsafe
{ {
Buffer.MemoryCopy(mat.DataPointer, videoFrame.DataStream.DataPointer.ToPointer(), videoFrame.Length, videoFrame.Length); Buffer.MemoryCopy(mat.DataPointer, videoFrame.DataStream.DataPointer.ToPointer(), videoFrame.Length, videoFrame.Length);
......
...@@ -62,11 +62,6 @@ namespace VIZ.Framework.Common ...@@ -62,11 +62,6 @@ namespace VIZ.Framework.Common
public long TimeStamp { get; set; } public long TimeStamp { get; set; }
/// <summary> /// <summary>
/// 是否是最后一帧
/// </summary>
public bool IsEnd { get; set; }
/// <summary>
/// 画面数据 /// 画面数据
/// </summary> /// </summary>
public DataStream DataStream { get; set; } public DataStream DataStream { get; set; }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment