roboforum.ru

Технический форум по робототехнике.

wi-fi передача изображений камеры на комп

Наше хобби — конструировать и программировать.
Демонстрация готовых роботов и устройств построенных своими руками.

wi-fi передача изображений камеры на комп

Сообщение zloy_molo4nik » 08 окт 2012, 10:35

Решил создать тему именно на этом форуме потому, что тут всегда можно получить ответ. Всегда найдутся люди которые помогут.
Делаю робота на основе мобильно телефона (Nokia 5530). Компьютер будет в роли сервера. Обмен данными производится через вайфай. Под телефон пишу на JavaME. Написал первое приложение для обмена сообщениями с телефона на комп и обратно, все работает на ура. Программа-сервер ПОКА написана на Делфи. Перешел ко второму этапу разработки ПО для телефона. Нужно передавать кадры с камеры на комп через вайфай 2 раза в секунду. И тут начался кошмар, с JavaME знаком только пару недель. Я пока пытаюсь отослать 1 кадр на комп. И проблема в том что кадр удается получить, даже отправляет, но когда я пытаюсь сохранить полученный кадр, то открыть эту картинку для просмотра не получается, говорит что файл поврежден. Ниже код отправки этого самого кадра
Код: Выделить всёРазвернуть
public void SendIm()
      {
          try
          {
              System.out.println("Get snapshot");
              byte[] raw = videoControl.getSnapshot("encoding=png"); // получаем png картинку с камеры
              int size;
              size = raw.length; // получаем ее размер
              String s;
              s = "file"+Integer.toString(size)+"/";  // сообщение о том что это файл и его размер           
              byte[] d = s.getBytes(); // переводим s в массив байт
              System.out.println(s);
            try
              {       
                  outputStream.write(d); // отправляем на сервер размер файла
                  outputStream.flush();
                  dataOutputStream.write(raw);// отправляем на сервер сам файл
                  dataOutputStream.flush();
              }catch(IOException ioe){}
          }catch(MediaException me){}
      }


На делфи прием файла сделан так:
Код: Выделить всёРазвернуть
rocedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
const
  MAX_BUF_SIZE = $4095;  //Константа буффера
var
sd:integer;
buf: TByteArr;
b: array [0..1] of byte;
str:string;
I,c: integer;
S,RText: String;
Letra: char;
MemoryStream: TMemoryStream;  //Переменная потока памяти
  Buffer: array [0..MAX_BUF_SIZE] of Char;  //Переменная буффера
  pc: PChar;
begin
Timer1.Enabled := true;
RText := Socket.ReceiveText;
if Receive=true then // если сервер в режиме приема файла
  begin
    Writing(RText); // принимаем файл
  end
    else   
  begin
    if copy(RText, 1,4)='file' then // если первое слово в пришедшем пакете file то переводим сервер в режим приема
      begin
        MS := TMemoryStream.Create();
        Delete(RText,1,4); // удаляем из сообщения file
        size := StrToInt(copy(RText,1,pos('/',RText)-1)); // получаем размер файла
        Delete(RText,1,POS('/',RText));
        Receive := true; // переводим серевер в режим приема
if RText <>'' then
        Writing(RText); // принимаем файл
      end;
  end;


procedure TForm1.Writing(TextS: string);
begin
  if MS.Size < size then // если размер буфера меньше  размера файла
  begin
    MS.Write(Texts,Length(Texts)); // пишем в память принятый кусок файла
    //  sMemo1.Lines.Add('Write');
    sProgressBar1.Position := MS.Size*100 div size;
     sStatusBar1.SimpleText := 'Принято '+IntToStr(MS.Size)+' из '+IntToStr(Size);
     end;
     if MS.Size = size then // если приняли все то
     begin
      Receive := true;
      MS.Position := 0;
      MS.SaveToFile('C:\Stream.png'); сохраняем файл на диск
  // Image4.Picture.Bitmap.LoadFromStream(MS);
    //  sMemo1.Lines.LoadFromStream(ms);
      MS.Free;

      sStatusBar1.SimpleText := 'Файл принят';
     end;
end;


И тут проблема, файл в конце оказывается битым. Подскажите что тут не так. Где ошибка.
Аватара пользователя
zloy_molo4nik
 
Сообщения: 19
Зарегистрирован: 29 июн 2012, 21:04
Skype: zloy_molo4nik

Re: wi-fi передача изображений камеры на комп

Сообщение Romikgy » 08 окт 2012, 10:51

а какой размер файла получается ? если больше 1500 байт , тогда он бьется на несколько частей и их нужно склеивать на приеме ИМХО
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: wi-fi передача изображений камеры на комп

Сообщение zloy_molo4nik » 08 окт 2012, 10:57

Если пересылать картинку в png, то размер около 300кб если bmp, то 900кб, все остальные форматы где-то посредине. Я так и пытаюсь склеивать эти пакеты. А может быть такое что во врема отправки или приема кодировка меняется? И поэтому файлы битые получаются.
Аватара пользователя
zloy_molo4nik
 
Сообщения: 19
Зарегистрирован: 29 июн 2012, 21:04
Skype: zloy_molo4nik

Re: wi-fi передача изображений камеры на комп

Сообщение elmot » 08 окт 2012, 11:13

zloy_molo4nik писал(а):Под телефон пишу на JavaME.

Зря. Скорее всего, будут наисерьезнейшие проблемы с производительностью.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: wi-fi передача изображений камеры на комп

Сообщение zloy_molo4nik » 08 окт 2012, 11:14

Ну что тогда предложите. Нужно передавать видео с камеры на комп.
Аватара пользователя
zloy_molo4nik
 
Сообщения: 19
Зарегистрирован: 29 июн 2012, 21:04
Skype: zloy_molo4nik

Re: wi-fi передача изображений камеры на комп

Сообщение elmot » 08 окт 2012, 11:16

zloy_molo4nik писал(а): RText := Socket.ReceiveText;

Здесь происходит перевод байтов в текст с искажением или потерей некоторых символов, т.к. они не текстовые или трактуются как "не в той кодировке"
MS.Write(Texts,Length(Texts)); // пишем в память принятый кусок файла

Здесь происходит обратное преобразование, но данные уже искажены.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: wi-fi передача изображений камеры на комп

Сообщение zloy_molo4nik » 08 окт 2012, 11:19

Тоесть проблемы с самим приемом картинки? Если я правильно понял) Значит нужно пересмотреть прием
Аватара пользователя
zloy_molo4nik
 
Сообщения: 19
Зарегистрирован: 29 июн 2012, 21:04
Skype: zloy_molo4nik

Re: wi-fi передача изображений камеры на комп

Сообщение elmot » 08 окт 2012, 11:52

Думаю, да
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: wi-fi передача изображений камеры на комп

Сообщение zloy_molo4nik » 08 окт 2012, 11:57

Спасибо за совет. Извиняюсь за наглость, а есть примеры как можно принять эти байты правильно, без искажений. Просто запутался куда читать или MemoryStream или Buffer (socket.ReceiveBuf).
Аватара пользователя
zloy_molo4nik
 
Сообщения: 19
Зарегистрирован: 29 июн 2012, 21:04
Skype: zloy_molo4nik

Re: wi-fi передача изображений камеры на комп

Сообщение elmot » 08 окт 2012, 12:00

У меня - нету. Я последний раз видел дельфи сто лет назад.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: wi-fi передача изображений камеры на комп

Сообщение zloy_molo4nik » 08 окт 2012, 13:41

elmot, а что бы ты посоветовал использовать для корректного приема картинки, мне ее надо будет обрабатывать библиотеками OpenCV
Аватара пользователя
zloy_molo4nik
 
Сообщения: 19
Зарегистрирован: 29 июн 2012, 21:04
Skype: zloy_molo4nik

Re: wi-fi передача изображений камеры на комп

Сообщение o_serg » 08 окт 2012, 14:50

Используй ReceiveBuf, принимай в TByteArray а потом в MemoryStream или сразу FileStream
o_serg
 
Сообщения: 62
Зарегистрирован: 23 май 2006, 23:14
Откуда: Kostroma

Re: wi-fi передача изображений камеры на комп

Сообщение zloy_molo4nik » 08 окт 2012, 15:27

Все, разобрался, спасибо. Хотел бы задать вопрос по J2ME. Передаю картинку с камеры телефона, исслользую getSnapshot(), но после этой функции задержка, и картинка долго приходит где-то секунду 1,5. Есть ли способы как-то быстрей сделать снимок с камеры.
Аватара пользователя
zloy_molo4nik
 
Сообщения: 19
Зарегистрирован: 29 июн 2012, 21:04
Skype: zloy_molo4nik

Re: wi-fi передача изображений камеры на комп

Сообщение Romikgy » 08 окт 2012, 16:00

шли в бмп или raw
die Wahrheit ist irgendwo da draußen
Аватара пользователя
Romikgy
 
Сообщения: 750
Зарегистрирован: 15 ноя 2009, 13:37
Откуда: Porto Franco "Odessa"

Re: wi-fi передача изображений камеры на комп

Сообщение zloy_molo4nik » 08 окт 2012, 16:13

raw? Где можно почитать про рав?

Добавлено спустя 9 минут 27 секунд:
Все разобрался, спасибо
Аватара пользователя
zloy_molo4nik
 
Сообщения: 19
Зарегистрирован: 29 июн 2012, 21:04
Skype: zloy_molo4nik

След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11