Я только что создал эту учетную запись, поэтому, пожалуйста, прости меня, если я забыл важную информацию.
У меня есть следующий код, но я подозреваю, что есть утечка памяти. Цель кода - получить байты из изображения с (смоделированной) камеры и с их помощью создать изображение EmguCV. Проблема в том, что длина сгенерированного массива никогда не остается прежней. Когда я генерирую изображение размером 300x300, я ожидаю, что массив будет содержать 90000 записей. Но это очень редко так. Номер постоянно меняется.
Я пытался следовать некоторым урокам о том, как правильно использовать команду «using» для удаления переменной, но до сих пор не получилось. Насколько я могу судить, похоже, что для списка байтов, который я использую, нет функции IDisposable. Так что это может быть причиной моей неудачи: /
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Emgu.CV;
using Emgu.CV.Structure;
namespace opencv_test
{
class Program
{
static void Main(string[] args)
{
Stemmer.Cvb.Image image = new Stemmer.Cvb.Image(300, 300);
image.Initialize(125);
List<byte> values = new List<byte>();
CopyPixelWithValue(image, values);
byte[] myArray = values.ToArray();
Emgu.CV.Image<Gray, Byte> test = new Image<Gray, Byte>(300, 300);
test.Bytes = myArray;
test.Save("D:/abc.jpg");
}
static unsafe void CopyPixelWithValue(Stemmer.Cvb.Image toGetValuesFrom, List<byte> values)
{
int width = toGetValuesFrom.Width;
int height = toGetValuesFrom.Height;
var toCopyData = toGetValuesFrom.Planes[0].GetLinearAccess();
byte* toCopyBase = (byte*)toCopyData.BasePtr;
long toCopyYInc = toCopyData.YInc.ToInt64();
long toCopyXInc = toCopyData.XInc.ToInt64();
Parallel.For(0, height, y =>
{
var pSrcLine = toCopyBase + y * toCopyYInc;
for (int x = 0; x < width; x++)
{
var srcVal = *(pSrcLine + x * toCopyXInc);
values.Add(srcVal);
}
});
}
}
}
Любая помощь в том, как решить эту проблему, будет с благодарностью принята !!