Имя: Пароль:
1C
 
Захват изображения с web камеры
0 ПульсЪ
 
12.10.10
17:53
Всем привет, есть обработка, захватывает изображение с вебки и передает снимок на форму.

Процедура КнопкаВыполнитьНажатие(Кнопка)
   TempИмя = ПолучитьИмяВременногоФайла("jpg");
   Для К = 1 По DeviceCount Цикл
       Если oDevice[к-1] <> Неопределено Тогда
           Item = oDevice[к-1].ExecuteCommand("{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}");
           Image = Item.Transfer("{557CF401-1A04-11D3-9A73-0000F81EF32E}");
           Image.Height = 1024;
           Image.Width = 1240;
           Image.SaveFile(TempИмя);
           Картинка = Новый Картинка(TempИмя);
           УдалитьФайлы(TempИмя);
       КонецЕсли;
   КонецЦикла;
   Если Не Картинка = Неопределено Тогда    
       ЭлементыФормы.ПолеКартинки1.Картинка = Картинка;
   КонецЕсли;
КонецПроцедуры


все вроде бы нормально, за исключением качества фотки
в отладчике смотрел, в свойствах Image.Width стоит 640, а в Image.Height стоит 480, вопрос:

как изменить эти значения на 1024 и 1280? пробывал

Image.Height = 1024;
Image.Width = 1240;

выдает ошибку "Поле объекта не доступно для записи".

как решить проблему? может кто нибудь сталкивался?
1 Buster007
 
12.10.10
17:56
можт вебка не способна на такое разрешение?
2 ПульсЪ
 
12.10.10
18:00
способна, в настройках вебки можно ставить такое разрешение, она даже фоткает нормально, а в 1С почему то передает картинку с таким разрешением.. + проверял на трех вебках
3 Shurjk
 
12.10.10
18:03
(2) а  в файле какая картинка лежит?
4 ПульсЪ
 
12.10.10
18:04
(3) вплане какая?
5 Shurjk
 
12.10.10
18:05
(4) С каким разрешением
6 Shurjk
 
12.10.10
18:06
+(5) То есть у тебя вебка фотает сохраняет в файл а затем на форму пихает. Где тебя качество не устраивает уже на форме или в файле?
7 ПульсЪ
 
12.10.10
18:11
(5) я запускаю обработку, при нажатии на кнопку выполнить вебка фоткает.  на строке Image.SaveFile(TempИмя);
она сохраняет изображние TEMP с расширением 640 на 480.

нужно что бы сохранялось расширение 1024 на 1280 .. что то не канает(
8 ПульсЪ
 
12.10.10
18:12
(6) качесво не утраивает и там и там, но если сам файл будет создаваться с нужным разрешением, то соответственно и на форме он то же будет норм
9 Shurjk
 
12.10.10
18:15
(7) 1с здесь не при чем, рой доку тому Execute что ты для устройства выполняешь.
10 ПульсЪ
 
12.10.10
18:17
(9) вот я и интересуюсь что мб кто нибудь сталкивался с такой проблемой
11 Shurjk
 
12.10.10
18:18
(10) MSDN тебе в помощь.
12 ПульсЪ
 
12.10.10
18:21
(11) хехе))
13 david2002ru
 
12.10.10
18:34
Пошукай в реестре свойства ключа {557CF401-1A04-11D3-9A73-0000F81EF32E}. Может там разрешение кадра устанавливается?
14 ПульсЪ
 
12.10.10
18:38
(13) нету такого ключЧа
15 ПульсЪ
 
13.10.10
10:06
ну и что граждане никто не работал с WIA.ImageProcess ??
16 ПульсЪ
 
13.10.10
10:12
ну или с WIA.DeviceManager
17 Salvador Limones
 
13.10.10
10:14
Item = oDevice[к-1].ExecuteCommand("{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}");
Image = Item.Transfer("{557CF401-1A04-11D3-9A73-0000F81EF32E}");

ОбрабИзобр = Новый COMОбъект("Wia.ImageProcess");
ОбрабИзобр.Filters.Add(ОбрабИзобр.FilterInfos("Scale").FilterID);
ОбрабИзобр.Filters(1).Properties("MaximumWidth").Value = 1240;
ОбрабИзобр.Filters(1).Properties("MaximumHeight").Value = 1240;    
ОбрабИзобр.Filters.Add(ОбрабИзобр.FilterInfos("Convert").FilterID);    
ОбрабИзобр.Filters(2).Properties("FormatID").Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
ОбрабИзобр.Filters(2).Properties("Quality").Value = 85;
   
Изображение = ОбрабИзобр.Apply(Image);
Изображение.SaveFile(TempИмя);
Картинка = Новый Картинка(TempИмя);


Примерно так.
18 ПульсЪ
 
13.10.10
10:18
хм интересно, я тут что то похожее накопал, но вроде не так, ща гляну, скажу
19 ПульсЪ
 
13.10.10
10:22
(17) свойства меняются, но картинка всеравно поганово качества(

у меня примерно такой же код раздобыл, тока чуть по другому

Item = oDevice[к-1].ExecuteCommand("{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}");
           Image = Item.Transfer("{557CF401-1A04-11D3-9A73-0000F81EF32E}");
           
           
           Image.SaveFile(TempИмя);
           
           Проба = Новый COMОбъект("WIA.ImageFile");
           Проба.LoadFile(TempИмя);
           ДляОбработки = Новый COMОбъект("WIA.ImageProcess");
           ID=ДляОбработки.FilterInfos("Scale").FilterID;
           ДляОбработки.Filters.Add(ID);
           ДляОбработки.Filters.Item(1).Properties.Item(1).Value = 1200;
           ДляОбработки.Filters.Item(1).Properties.Item(2).Value = 1600;
            Проба = ДляОбработки.Apply(Проба);
             ПутьНовый = TempИмя;
            УдалитьФайлы(TempИмя);
           Проба.SaveFile(ПутьНовый);
20 ПульсЪ
 
13.10.10
10:24
тут нужно как то менять изображение до его создания, в отладчике смотрел, сначала создается картинка, а потом уже меняется разрешение, ну а естественно из хорошего в плохое можно, а из плохого  в хорошее низя( тут как раз такой случай
21 Salvador Limones
 
13.10.10
10:25
(19) Скорее всего в image уже отстой, идёт изображение на минимальных дефолтных настройках.
22 Salvador Limones
 
13.10.10
10:28
Вот мой код, полностью рабочий. Получает картинку со сканера.
Процедура ВставитьИзображениеСоСканераНажатие(Элемент)
   ВременныйФайлДляЗагрузки = КаталогВременныхФайлов()+"\tempscan.jpg";
   СканМенеджер = Новый COMОбъект("WIA.DeviceManager");
   ДиалогСканера = Новый COMОбъект("WIA.CommonDialog");

   для каждого СканерСтр из СканМенеджер.DeviceInfos цикл
       если СканерСтр.Type = 1 тогда
           Сканер = СканерСтр.Connect();
           Прервать;
       КонецЕсли;
   КонецЦикла;

   Содерж = Сканер.Items.Item(1);
   Свойства = Содерж.Properties;
   для каждого СтрСв из Свойства цикл
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "6147" тогда
           СтрСв.Value = 300;
       КонецЕсли;
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "6148" тогда
           СтрСв.Value = 300;
       КонецЕсли;
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "6149" тогда
           СтрСв.Value = 0;
       КонецЕсли;
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "6150" тогда
           СтрСв.Value = 0;
       КонецЕсли;
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "6151" тогда
           СтрСв.Value = СтрСв.SubTypeMax;
       КонецЕсли;
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "6152" тогда
           СтрСв.Value = СтрСв.SubTypeMax;
       КонецЕсли;
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "6146" тогда
           СтрСв.Value = 1;
       КонецЕсли;
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "6154" тогда
           //СтрСв.Value = 20;
       КонецЕсли;
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "6155" тогда
           СтрСв.Value = 30;
       КонецЕсли;
       если Формат(СтрСв.PropertyID,"ЧГ=0") = "4103" тогда
           СтрСв.Value = 0;
       КонецЕсли;
       
   КонецЦикла;
   imageFile = ДиалогСканера.ShowTransfer(Содерж);
   
   ОбрабИзобр = Новый COMОбъект("Wia.ImageProcess");
   ОбрабИзобр.Filters.Add(ОбрабИзобр.FilterInfos("Scale").FilterID);
   ОбрабИзобр.Filters(1).Properties("MaximumWidth").Value = 1123;
   ОбрабИзобр.Filters(1).Properties("MaximumHeight").Value = 1123;    
   ОбрабИзобр.Filters.Add(ОбрабИзобр.FilterInfos("Convert").FilterID);    
   ОбрабИзобр.Filters(2).Properties("FormatID").Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
   ОбрабИзобр.Filters(2).Properties("Quality").Value = 85;
   
   Изображение = ОбрабИзобр.Apply(imageFile);
   Изображение.SaveFile(ВременныйФайлДляЗагрузки);
   
   ВыбранноеИзображение = Новый Картинка(ВременныйФайлДляЗагрузки, Ложь);
   НовСтр = ИзображенияРег.Добавить();
   НовСтр.Хранилище = Новый ХранилищеЗначения(ВыбранноеИзображение, Новый СжатиеДанных);
   УдалитьФайлы(ВременныйФайлДляЗагрузки);
КонецПроцедуры
23 ПульсЪ
 
13.10.10
10:31
(19)  я то же так думаю.. а есть какие нибудь варианты перехвата изображения?


самое интересное что прогу логите4 не ставил, было качество 640х480, поставил прогу стало 320 на 240 (( нужно как минимум 1024 на 1400(( а в самой прогеще интереснее делал увеличение на максимум, код цепплял настройки и передавал как надо, но вот ставлю настройки разрешения - не цепляет(
24 ПульсЪ
 
13.10.10
10:32
(22) но вот это по сути то что ты и написал в (17)
25 Salvador Limones
 
13.10.10
10:34
(24) В (22) полностью. Поиск и подключение к сканеру, установка настроек, получение изображения.
Попробуй, только для вебки нужно СканерСтр.Type = 1 поменять на другой тип.
26 ПульсЪ
 
13.10.10
10:34
еще кстате, я код полностью понмаю, кроме этогго

Item = oDevice[к-1].ExecuteCommand("{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}");

что это значит?
27 ПульсЪ
 
13.10.10
10:34
(25) ок, ща попробую
28 ПульсЪ
 
13.10.10
10:42
(25) блин, че т код не подогнать, тип вебки 3
29 ПульсЪ
 
13.10.10
10:49
подогнал,  зараза, в имэйдж файл уже передается 240 на 320, блин, хрень какая то ((((
30 ПульсЪ
 
13.10.10
10:50
хотя один плюс) твой код работает быстрее)
31 Ленинград
 
13.10.10
10:54
закладочко
32 ПульсЪ
 
13.10.10
10:58
(31) хехе_)
33 ПульсЪ
 
13.10.10
11:10
Люди... )) есть кто еще живой?)))
34 Salvador Limones
 
13.10.10
11:15
(33) Я уже не знаю, чем помочь. У меня со сканерами всё пашет. С разными, Epson и какое то МФУ Canon
35 ПульсЪ
 
13.10.10
11:21
(34) спасиб)

я сам день и пол ночи ковырялся, результат нулевой.. нужно как то изменять свойства картинки до ее создания..

еще меня смущает строчка

Item = oDevice[к-1].ExecuteCommand("{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}");
36 Salvador Limones
 
13.10.10
11:24
(35) Судя по http://msdn.microsoft.com/en-us/library/ms630829(VS.85).aspx
значит дать устройству команду снять изображение.
37 ПульсЪ
 
13.10.10
11:28
тогда код



   TempИмя = ПолучитьИмяВременногоФайла("jpg");
   
   Для К = 1 По DeviceCount Цикл
       Если oDevice[к-1] <> Неопределено Тогда
           
Item = oDevice[к-1].ExecuteCommand("{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}");
Image = Item.Transfer("{557CF401-1A04-11D3-9A73-0000F81EF32E}");
ОбрабИзобр = Новый COMОбъект("Wia.ImageProcess");
ОбрабИзобр.Filters.Add(ОбрабИзобр.FilterInfos("Scale").FilterID);
ОбрабИзобр.Filters(1).Properties("MaximumWidth").Value = 1240;
ОбрабИзобр.Filters(1).Properties("MaximumHeight").Value = 1240;    
ОбрабИзобр.Filters.Add(ОбрабИзобр.FilterInfos("Convert").FilterID);    
ОбрабИзобр.Filters(2).Properties("FormatID").Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
ОбрабИзобр.Filters(2).Properties("Quality").Value = 85;

   
Изображение = ОбрабИзобр.Apply(Image);
Изображение.SaveFile(TempИмя);
Картинка = Новый Картинка(TempИмя);
           
           
           Картинка = Новый Картинка(TempИмя);
           УдалитьФайлы(TempИмя);
       КонецЕсли;
   КонецЦикла;
   
   Если Не Картинка = Неопределено Тогда
       
       ЭлементыФормы.ПолеКартинки1.Картинка = Картинка;
       
   КонецЕсли;


верный.. вроде бы
38 ПульсЪ
 
13.10.10
11:29
изображение  создается в jpg, затем снимается с камеры, задаются его свойства,затем сохраняется..
39 ПульсЪ
 
13.10.10
11:34
вот весь код обработки: может еще где косяк.. на форме одна картинка, в котоорую при нажатии на выполнить и передается изображение


Перем oDevice;
Перем DeviceCount;
Процедура КнопкаВыполнитьНажатие(Кнопка)
   TempИмя = ПолучитьИмяВременногоФайла("jpg");
   Для К = 1 По DeviceCount Цикл
       Если oDevice[к-1] <> Неопределено Тогда
Item = oDevice[к-1].ExecuteCommand("{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}");
Image = Item.Transfer("{557CF401-1A04-11D3-9A73-0000F81EF32E}");
ОбрабИзобр = Новый COMОбъект("Wia.ImageProcess");
ОбрабИзобр.Filters.Add(ОбрабИзобр.FilterInfos("Scale").FilterID);
ОбрабИзобр.Filters(1).Properties("MaximumWidth").Value = 1240;
ОбрабИзобр.Filters(1).Properties("MaximumHeight").Value = 1240;    
ОбрабИзобр.Filters.Add(ОбрабИзобр.FilterInfos("Convert").FilterID);    
ОбрабИзобр.Filters(2).Properties("FormatID").Value = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
ОбрабИзобр.Filters(2).Properties("Quality").Value = 85;  
Изображение = ОбрабИзобр.Apply(Image);
Изображение.SaveFile(TempИмя);
Картинка = Новый Картинка(TempИмя);            
           Картинка = Новый Картинка(TempИмя);
           УдалитьФайлы(TempИмя);
       КонецЕсли;
   КонецЦикла;
   Если Не Картинка = Неопределено Тогда    
       ЭлементыФормы.ПолеКартинки1.Картинка = Картинка;    
   КонецЕсли;
КонецПроцедуры




Процедура ПриОткрытии()
   Попытка    
       Device = Новый COMОбъект("WIA.DeviceManager");
   Исключение
       //ОбщегоНазначения.СообщитьОбОшибке("Не установлена компонента WIA!");
       Сообщить("Не установлена компонента WIA!");
       Возврат
   КонецПопытки;
   DeviceCount = Device.DeviceInfos.Count;
   Если DeviceCount > 0 Тогда
       oDevice = Новый Массив(DeviceCount);
       Для К=1 По DeviceCount Цикл
           Если Device.DeviceInfos(к).Type = 3 Тогда
               Попытка
                   oDevice[к-1] = Device.DeviceInfos(к).Connect();
               Исключение
                   oDevice[к-1] = Неопределено;
               КонецПопытки;
           Иначе
               oDevice[к-1] = Неопределено;
           КонецЕсли;
       КонецЦикла;
   КонецЕсли;
   
КонецПроцедуры
40 Salvador Limones
 
13.10.10
11:50
(39) Так после того как сделал Connect(), выставь параметры.
Содерж = oDevice[к-1].Items.Item(1);
   Свойства = Содерж.Properties;
   для каждого СтрСв из Свойства цикл
и так далее
41 ПульсЪ
 
13.10.10
11:54
(40) непонимаю(
42 ПульсЪ
 
13.10.10
12:20
обновение..)
43 ПульсЪ
 
13.10.10
12:52
+(42)
44 ПульсЪ
 
13.10.10
16:17
+(43)
45 ПульсЪ
 
13.10.10
17:25
up
46 Salvador Limones
 
13.10.10
17:27
Ну что "ап"? Поставь Properties после коннекта
47 ПульсЪ
 
13.10.10
17:33
(46) да ужо ставил) все уже перепробывал, пришел к выводу Захват изображения с web камеры
48 david2002ru
 
14.10.10
01:28
Решал (и решил) задачку для медицины для двух разных камер...
Давайте по-порядку:
1. У каждой камеры есть документация. В ней сказано, в каком формате, какого разрешения и при каких условиях можно получить кадр изображения.
Если нужное разрешение "как минимум 1024 на 1400" в jpg прописано - то едем дальше.
2. Как правило к каждой камере прилагается программа, ее тестирующая. Если с ее помощью нужный результат достигается, то задачка заведомо решается. Существуют "универсальные" программы, опрашивающие Web-камеры. (На случай отсутствия родной). Если результат устраивает (удалось на диск сохранить нужный кадр), движемся дальше.
3. Далее - альтернатива: пытаться на 1с ваять считывание кадра и его обработку, или возложить задачу считывания нужного изображения на стороннюю программу.
(Думаю, обработка оного в 1с примерна такая же как скажем на Delphi, то есть не чрезмерно сложна).
4. По ряду причин, в частности из-за необходимости обработки кадра, я считывал кадр с помощью программки на C++ (Хотя делал варианты и на Delphi и на Sharp и на Java). Для этого посылал команду типа "дай кадр" поверх http через сокет. Параметры самой камеры были ЗАРАНЕЕ настроены и размер кадра более не менялся. Ничто не мешает полученный кадр сохранить на диск и тд.
5. В любом случае, не проделав 1 и 2 пункты, опираться не на что.
6. Чтобы поменять параметры кадра и тп. для камер нужно было послать КОМАНДУ на камеру. Тогда с камеры можно было считать другой Jpg (с другими параметрами). Изменение кадра путем изменения Image-приемника в 1с напрямую "не прокатит".
7. Коротко говоря, настраивать нужно web-камеру для нужного jpg. Считывать его по "команде" в СОГЛАСОВАННЫЙ объект (Device) и выводить на экран в СОГЛАСОВАННЫЙ Image. Параметры Device видимо записываются в соответствующем ключе в реестре. Параметры объекта Image - при его создании.
49 inspam
 
14.10.10
01:33
закладка
50 ПульсЪ
 
14.10.10
13:41
всем спс, нашел другой способ, с помощью компоненты Душелова)

но появилась новая проблема, кто нибудь сталкивался, какубрать окно настроек при старте обработки?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.