Я пытаюсь использовать ISampleGrabberCB::BufferCB
для преобразования текущего кадра в растровом используя следующий код: Однако это не кажетсяКак преобразовать буфер ISampleGrabber :: BufferCB к растровым
int ISampleGrabberCB.BufferCB(double sampleTime, IntPtr buffer, int bufferLength)
{
try
{
Form1 form1 = new Form1("", "", "");
if (pictureReady == null)
{
Debug.Assert(bufferLength == Math.Abs(pitch) * videoHeight, "Wrong Buffer Length");
}
Debug.Assert(imageBuffer != IntPtr.Zero, "Remove Buffer");
Bitmap bitmapOfCurrentFrame = new Bitmap(width, height, capturePitch, PixelFormat.Format24bppRgb, buffer);
MessageBox.Show("Works");
form1.changepicturebox3(bitmapOfCurrentFrame);
pictureReady.Set();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
return 0;
}
это работает.
Кроме того, кажется, вызвать эту функцию, когда я нажимаю кнопку, которая запускает следующий код:
public IntPtr getFrame()
{
int hr;
try
{
pictureReady.Reset();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
imageBuffer = Marshal.AllocCoTaskMem(Math.Abs(pitch) * videoHeight);
try
{
gotFrame = true;
if (videoControl != null)
{
hr = videoControl.SetMode(stillPin, VideoControlFlags.Trigger);
DsError.ThrowExceptionForHR(hr);
}
if (!pictureReady.WaitOne(9000, false))
{
throw new Exception("Timeout waiting to get picture");
}
}
catch
{
Marshal.FreeCoTaskMem(imageBuffer);
imageBuffer = IntPtr.Zero;
}
return imageBuffer;
}
После того, как этот код выбежал я получаю окно сообщения, которое показывает «работает», таким образом, что означает мое BufferCB
сусло но не обновляет картинку с текущим изображением.
Является ли BufferCB
не вызывается после каждого нового кадра? Если да, почему я не получаю сообщение «Работы»?
Наконец, можно преобразовать каждый новый кадр в растровое изображение (это используется для последующей обработки) с использованием BufferCB
, и если да, то как?
Edited код:
int ISampleGrabberCB.BufferCB(double sampleTime, IntPtr buffer, int bufferLength)
{
Debug.Assert(bufferLength == Math.Abs(pitch) * videoHeight, "Wrong Buffer Length");
Debug.Assert(imageBuffer != IntPtr.Zero, "Remove Buffer");
CopyMemory(imageBuffer, buffer, bufferLength);
Decode(buffer);
return 0;
}
public Image Decode(IntPtr imageData)
{
var bitmap = new Bitmap(width, height, pitch, PixelFormat.Format24bppRgb, imageBuffer);
bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
Form1 form1 = new Form1("", "", "");
form1.changepicturebox3(bitmap);
bitmap.Save("C:\\Users\\...\\Desktop\\A2 Project\\barcode.jpg");
return bitmap;
}
Код кнопки:
public void getFrameFromWebcam()
{
if (iPtr != IntPtr.Zero)
{
Marshal.FreeCoTaskMem(iPtr);
iPtr = IntPtr.Zero;
}
//Get Image
iPtr = sampleGrabberCallBack.getFrame();
Bitmap bitmapOfFrame = new Bitmap(sampleGrabberCallBack.width, sampleGrabberCallBack.height, sampleGrabberCallBack.capturePitch, PixelFormat.Format24bppRgb, iPtr);
bitmapOfFrame.RotateFlip(RotateFlipType.RotateNoneFlipY);
barcodeReader(bitmapOfFrame);
}
public IntPtr getFrame()
{
int hr;
try
{
pictureReady.Reset();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
imageBuffer = Marshal.AllocCoTaskMem(Math.Abs(pitch) * videoHeight);
try
{
gotFrame = true;
if (videoControl != null)
{
hr = videoControl.SetMode(stillPin, VideoControlFlags.Trigger);
DsError.ThrowExceptionForHR(hr);
}
if (!pictureReady.WaitOne(9000, false))
{
throw new Exception("Timeout waiting to get picture");
}
}
catch
{
Marshal.FreeCoTaskMem(imageBuffer);
imageBuffer = IntPtr.Zero;
}
return imageBuffer;
}
мне еще нужно нажать на кнопку, чтобы запустить BufferCB
Спасибо за чтение.
Первое, что вы пропустили 'CopyMemory «Шаг, который я предложил. На самом деле вы вообще не используете переданный 'buffer'. Вы используете' imageBuffer'. Во-вторых, как я уже упоминал, вы не можете получить доступ к нити ui из пробоотборной нити. – Matthias
Итак, в 'Decode' я должен использовать буферную переменную из' BufferCB'? И да, извините, понял, что после того, как я отправил код, теперь я получаю изображение в сохраненном файле, однако pictureBox3 не обновляется? Также, как я должен повторно запускать метод BufferCB тогда (я знаю, что это происходит после каждого кадра, но это не приводит к тому, что я получаю, когда нажимаю кнопку). – legohead
Я уже разместил ссылку на операции с поперечными потоками. Когда люди пытаются помочь вам, вы должны прочитать все, что они скажут вам. Не обижайтесь, но вы не можете ожидать, что кто-то решает все ваши проблемы только в одном вопросе. Пожалуйста, постарайтесь, чтобы ваши предстоящие вопросы были короче. – Matthias