①openCVsharp 呼叫2個攝像頭讀取影像
②倒計時觸發保存影像
③保存時會提示物件被占用無法使用問題
private void CaptureRead(VideoCapture capture, PictureBox picture,ENM_CAPTURE eNM_CAPTURE)
{
//首先定義face_token表示為空
//人臉檢測
using (Mat frame = new Mat())
{
int i = 0;
while (!canel)
{
try
{
if (!capture.IsOpened()) capture.Open((int)eNM_CAPTURE);
//讀取圖片資訊
if (capture.Read(frame))
{
if (frame.Empty()) return;
picture.Image = Image.FromStream(new MemoryStream(frame.ToBytes()));
Thread.Sleep(60);
i++;
}
}
catch (Exception ex)
{
baseLogger.Error(ex.Message);
continue;
}
}
}
}
using (var img = pictureBox2.Image)
{
M_IMG iMG1 = new M_IMG();
iMG1.im_name = $"{montion.id}_F_{_SN.sn}.jpg";
iMG1.im_base64 = ImageBase64(img);
_SN.images.Add(iMG1);
}
using (var img = pictureBox3.Image)
{
M_IMG iMG2 = new M_IMG();
iMG2.im_name = $"{montion.id}_S_{_SN.sn}.jpg";
iMG2.im_base64 = ImageBase64(img);
_SN.images.Add(iMG2);
}
private string ImageBase64(Image img)
{
byte[] arr = null;
try
{
using (MemoryStream ms = new MemoryStream())
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
arr = new byte[ms.Length];
ms.Position = 0;
ms.Read(arr, 0, (int)ms.Length);
ms.Close();
}
}
catch (Exception ex)
{
baseLogger.Error(ex.Message);
AutoClosingMessageBox.Show(ex.Message, "錯誤", 3000);
}
return Convert.ToBase64String(arr);
}
uj5u.com熱心網友回復:
picture.Image = Image.FromStream(new MemoryStream(frame.ToBytes()));這句,會讓物件一直占用此圖片流:
解決方法:(以下是我在WPF中的解決方法,你根據自身情況解決)
讀取流之后,對流物件進行一次Clone,然后,用復本賦值界面控制元件:
Image image = Image.FromFile(x.FullName);
Image x1 = (Image)(image.Clone());
image.Dispose();//釋放原始檔案
//之后使用x1進行操作,完成之后,對x1進行釋放,如我在WPF中使用的所示
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/93460.html
標籤:C#
上一篇:C#
下一篇:ref引數用于異步執行緒
