using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using IOTContainer.Common;
using IOTContainer.Model;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using static IOTContainer.Common.FaceMethod;
namespace IOTContainer.View
{
///
/// FaceWindow.xaml 的交互逻辑
///
public partial class FaceWindow : Window
{
private Capture m_capture = null; // 摄像头操作对象
//private Capture m_capture1 = null; // 摄像头操作对象
private Thread m_threadFaceDet = null; // 检测线程
private Object m_lock = null; // 锁
//private Mat m_matFrame = null; // 当前帧
private Mat m_matFrame = new Mat(); // 当前帧
//private Mat m_matFrame1 = null; // 当前帧
private bool m_bStartThread = false;
private GCHandle m_gc;
[DllImport("gdi32")]
private static extern int DeleteObject(IntPtr o);
public static BitmapSource ToBitmapSource(Mat mat)
{
using (System.Drawing.Bitmap source = mat.ToImage().Bitmap)
{
IntPtr ptr = source.GetHbitmap();
BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
ptr,
IntPtr.Zero,
Int32Rect.Empty,
System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
DeleteObject(ptr);// 释放内存,否则内存泄露
return bs;
}
}
private bool IsInit = true;
bool isSuccess = true;
int i = 0;
public FaceWindow()
{
InitializeComponent();
try
{
int init = initGetFace(640, 480, 10);
if (init != 1)
{
IsInit = false;
}
}
catch (SEHException seh)
{
IsInit = false;
Log.MyLog.WriteLogFile("FaceWindow:"+ seh.ToString(), "FaceWindow");
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
m_lock = new object();
OnBtnOpenUsb();
}
// 开启USB摄像头
private void OnBtnOpenUsb()
{
if (m_bStartThread)
{
Log.MyLog.WriteLogFile("OnBtnOpenUsb:摄像头已打开", "FaceWindow");
return;
}
try
{
// 调用emgu打开摄像头,需先将emgu文件夹中的"cvextern.dll"拷贝到编译好的EXE程序目录"build_32/bin"中
m_capture = new Capture(FaceParameters.Parameters._cameraIndex);
m_capture.ImageGrabbed += ProcessFrame;//图像捕捉事件
m_capture.Start();
}
catch (Exception exec)
{
Log.MyLog.WriteLogFile(exec.Message + "\r\n请将当前目录emgu下的cvextern.dll拷贝到执行程序目录", "FaceWindow");
}
}
private void ProcessFrame(object sender, EventArgs arg)
{
Mat mat = null;
lock (m_lock)
{
m_capture.Retrieve(m_matFrame, 0);
if (null != m_matFrame)
{
mat = m_matFrame.Clone();
}
this.Dispatcher.BeginInvoke(new Action(() =>
{
if (mat != null && !mat.IsEmpty)
{
var imageSource = ToBitmapSource(mat);
if (imageSource != null)
{
video.Source = imageSource; // 显示到界面上
}
}
}));
if (FaceParameters.Parameters._isOpenLive && m_matFrame != null)
{
try
{
using (Mat newFrame = new Mat(m_matFrame, new System.Drawing.Rectangle(new System.Drawing.Point(250, 140), new System.Drawing.Size(260, 260))))
{
try
{
VectorOfByte buff = new VectorOfByte();
CvInvoke.Imencode(".jpg", newFrame, buff);
byte[] encodeBuff = new byte[buff.Size];
Marshal.Copy(buff.StartAddress, encodeBuff, 0, buff.Size);
string base64Str = Convert.ToBase64String(encodeBuff);
Mat rmat = new Mat();
CvInvoke.Resize(newFrame,rmat,new System.Drawing.Size(640, 480));
Bitmap bm = rmat.Clone().Bitmap;
Image image = new Image(bm);
bm.RotateFlip(RotateFlipType.RotateNoneFlipX);
Mat newFrame2 = image.Mat;
VectorOfByte buff2 = new VectorOfByte();
CvInvoke.Imencode(".jpg", newFrame2, buff2);
var faceData = new FaceSendModel
{
age = 28,
genderMale = "男",
vipId = "",
faceID = "",
carNo = "",
isOK = "0",
faceImage = base64Str
};
try
{
if(IsInit)
{
var resultinfo = getFaceInfo(getFace(rmat.Ptr), rmat);
if (resultinfo.faceSize > 0)
{
foreach (var facepos in resultinfo.Faceobj)
{
var quality = new faceProperty();
quality = getProperty(rmat.Ptr, facepos);
if (quality.Sex == -1 || quality.Old == -1)
{
continue;
}
faceData.age = quality.Old;
faceData.genderMale = quality.Sex == 0 ? "男" : "女";
faceData.isOK = "1";
Log.MyLog.WriteLogFile($"发送视频流:{JsonConvert.SerializeObject(faceData)}", "EdgeFunction");
ComParameters.Parameters.EdgeWindow.pushFaceBase(JsonConvert.SerializeObject(faceData));
}
}
//推送视频流
//Log.MyLog.WriteLogFile($"发送视频流:{JsonConvert.SerializeObject(faceData)}", "EdgeFunction");
}
else
{
FaceParameters.Parameters.count ++;
if (FaceParameters.Parameters.count == 100)
{
try
{
faceData.age = 28;
faceData.genderMale = "男";
faceData.isOK = "1";
Log.MyLog.WriteLogFile($"发送视频流:{JsonConvert.SerializeObject(faceData)}", "EdgeFunction");
ComParameters.Parameters.EdgeWindow.pushFaceBase(JsonConvert.SerializeObject(faceData));
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile(ex.Message, "FaceWindow");
}
}
}
ComParameters.Parameters.EdgeWindow.pushFaceBase(JsonConvert.SerializeObject(faceData));
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile(ex.Message, "FaceWindow");
}
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile(ex.Message, "FaceWindow");
}
}
}
catch (Exception ex)
{
Log.MyLog.WriteLogFile(ex.Message, "FaceWindow");
}
}
}
}
public void ClosedWin()
{
m_bStartThread = false;
try
{
if (null != m_capture)
{
m_capture.Stop();
m_capture.Dispose();
}
}
catch (Exception exec)
{
}
if (m_gc.IsAllocated)
{
m_gc.Free();
}
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
m_bStartThread = false;
try
{
if (null != m_capture)
{
m_capture.Stop();
m_capture.Dispose();
}
}
catch (Exception exec)
{
}
if (m_gc.IsAllocated)
{
m_gc.Free();
}
}
//private void Window_Closed(object sender, EventArgs e)
//{
// m_bStartThread = false;
// try
// {
// if (null != m_capture)
// {
// m_capture.Stop();
// m_capture.Dispose();
// }
// }
// catch (Exception exec)
// {
// }
// if (m_gc.IsAllocated)
// {
// m_gc.Free();
// }
//}
}
}