Сделать снимок автоматически с помощью веб-камеры на C# с помощью WIA

Я использую WIALib для доступа к своей веб-камере. Код, который я разрабатываю, довольно прост: при нажатии кнопки делается снимок с веб-камеры, который затем отображается в окне изображения.

Я уже могу делать снимки с помощью своей веб-камеры, но она еще не полностью автоматизирована. Единственный способ, который я нашел для получения изображений, сделанных веб-камерой, - использовать это:

wiaPics = wiaRoot.GetItemsFromUI( WiaFlag.SingleImage, WiaIntent.ImageTypeColor ) as CollectionClass;

Но это просит пользователя выбрать изображение. И я всегда хочу сделать последний снимок. Итак, я пытаюсь так:

string imageFileName = Path.GetTempFileName(); // create temporary file for image

wiaItem = wiaRoot.TakePicture(); // take a picture

Cursor.Current = Cursors.WaitCursor; // could take some time

this.Refresh();

wiaItem.Transfer(imageFileName, false); // transfer picture to our temporary file

pictureBox1.Image = Image.FromFile(imageFileName); // create Image instance from file

Marshal.ReleaseComObject(wiaItem);

Но метод TakePicture() возвращает null, поэтому я не могу передать изображение. Самое странное, что картинка действительно была сделана после вызова метода TakePicture(), так как если я захожу в веб камеру вручную картинка есть! Я просто не понимаю, почему он не возвращает значение.

Подводя итог, мне нужно одно из этих двух: 1. Заставить TakePicture() работать, возвращая значение, которое я могу использовать. 2. Автоматический доступ к списку изображений веб-камеры, чтобы я мог получить последнее сделанное изображение.

С уважением и благодарностью за помощь, Микаэль.


person Micael    schedule 29.11.2010    source источник


Ответы (1)


Насколько я вижу, wiaItem = wiaRoot.TakePicture() идет по ложному пути. Попробуй это:

string imageFileName;
wiaRoot.TakePicture( out takenFileName);
pictureBox1.Image = Image.FromFile(imageFileName);

TakePicture сохраняет изображение в файл и возвращает имя нового файла в качестве выходного параметра.

Изменить в соответствии с вашим комментарием — вы используете «версию Windows 7» WiaLib? Если это так, попробуйте что-то вроде этого:

var manager = new DeviceManagerClass();
Item wiaItem;
Device device = null;
foreach (var info in manager.DeviceInfos)
{
    if (info.DeviceID == DESIRED_DEVICE_ID)
    {
        device = info.Connect();
        wiaItem = device.ExecuteCommand(CommandID.wiaCommandTakePicture);
    }
}

где вы используете ExecuteCommand с хорошо известным руководством (также доступным из COM-взаимодействия обертка), а не TakePicture. Во всяком случае, для моей веб-камеры это сработало.

person Philip Rieck    schedule 30.11.2010
comment
Спасибо за помощь Филиппу. Дело в том, что я получаю ошибку Нет перегрузки для метода TakePicture принимает 1 аргумент. :( - person Micael; 01.12.2010
comment
@Micael, если у вас новее, посмотрите, подойдет ли вам мое редактирование. - person Philip Rieck; 01.12.2010
comment
Я не знаю версию моей WiaLib. Я работаю под WindowsXP Pro и Visual Studio 2010. Когда я вставил ваш код, класс DeviceManagerClass и Device не были распознаны. Нужно ли мне добавлять еще одну ссылку, кроме WiaLib? Еще раз спасибо :) - person Micael; 01.12.2010
comment
@Micael Убедитесь, что вы добавляете ссылку COM в библиотеку Windows Image Acquisition Libarary 2.0. Device должно быть в пространстве имен WIA — убедитесь, что у вас есть using WIA. После этого вы сможете найти WIA.DeviceManagerClass. - person Philip Rieck; 01.12.2010
comment
Ну, я думаю, я не использую версию WIA для Windows 7, так как у меня есть только библиотека типов Microsoft Windows Image Acquisition 1.01. - person Micael; 01.12.2010
comment
@ Микаэль, ну, я вообще с этим не знаком. Однако вы можете запустить wia2.0 на компьютерах с XP: microsoft.com/downloads/en/. - person Philip Rieck; 01.12.2010
comment
Спасибо за помощь, Филипп! Я попробовал ваш фрагмент кода, и у меня есть это исключение [Исключение из HRESULT: 0x802100839] в строке, где должно быть сделано изображение. - person Micael; 02.12.2010
comment
Вы хоть понимаете, что означает это исключение? Я гуглил и ничего не нашел :( - person Micael; 03.12.2010
comment
@Micael Извините, я вообще с этим не знаком. Вы уверены, что у вас есть правильное устройство? - person Philip Rieck; 06.12.2010
comment
Да, я почти уверен, что устройство правильное ... В любом случае, спасибо за всю помощь, Филипп, но я думаю, что переключусь на DirectShow :) с уважением - person Micael; 08.12.2010