.NET 4.x Передача матрицы изображения по сети - C#

Узнай цену своей работы

Формулировка задачи:

Нужно передать картинку с телефона на сервер. Для телефона пиши на Java(Android Studio), а для сервера пишу на C#(Visusl Studio 2010).

В телефонном приложении применяю библиотеку OpenCV, а в серверном Emgu CV. С камеры кадр сохраняю в матрице Mat и нахожу прямоугольные участки(картины). Найденный участок или весь кадр нужно отправить на сервер. Сервер должен принять изображение и обработать.

Проблема возникла в передаче матрицы изображения. Есть кусок кода, неизвестно работает он или нет, т.к. не знаю как преобразовать массив в матрицу. Как преобразовать массив в матрицу? И если не правильно передаю данные, то как правильно передать? Текстовое сообщенис с сервера на телефон нормально передает.

Отправка с телефона.
class WorkingClass implements Runnable{
        @Override
        public void run() {
            try {
                Socket socket = new Socket("192.168.0.91", 80);
 
                //mRgba - матрица кадра.
                DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());
                byte[] byte_array = new byte[(int)(mRgba.total() * mRgba.channels())];
                mRgba.get(0, 0, byte_array);
                int size = byte_array.length;
                int width = (int)mRgba.size().width;
                int height = (int)mRgba.size().height;
                dOut.writeLong(size);
                dOut.writeInt(width);
                dOut.writeInt(height);
                dOut.write(byte_array);
                dOut.flush();
 
                in = new BufferedReader(new InputStreamReader( socket.getInputStream()));
                Log.d("Приняли; ", in.readLine());
 
                socket.close();
            } catch (Exception ee) {
                Log.d("sample application: ", "Fatal ERROR");
                Log.d("sample application: ", ee.toString());
            }
        }
    }
Прием на сервере.
public void SocketTcpServer()
        {

            // создаем сокет
            Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                int port = 80;
 
                IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("192.168.0.91"), port);
                // связываем сокет с локальной точкой, по которой будем принимать данные
                listenSocket.Bind(ipPoint);
 
                // начинаем прослушивание
                listenSocket.Listen(10);
 
                IPEndPoint newclient = (IPEndPoint)client.RemoteEndPoint;
 
                byte[] imageByteArray;
 
                while (true)
                {
                    Socket handler = listenSocket.Accept();
                    // получаем сообщение
                    StringBuilder builder = new StringBuilder();
                    byte[] data = new byte[256]; // буфер для получаемых данных
 
                    int size = handler.Receive(data);
                    int width = handler.Receive(data);
                    int height = handler.Receive(data);
                    imageByteArray = new byte[(int)size];
                    builder.Append(Encoding.Default.GetString(imageByteArray, 0, size));
                    Mat mat = new Mat();
 
                    //??? конвертировать массив в матрицу
 
                    // отправляем ответ
                    string message = "ваше сообщение доставлено";
                    data = Encoding.UTF8.GetBytes(message);
                    handler.Send(data);
                    // закрываем сокет
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }
            }
        
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            
        }

Решение задачи: «.NET 4.x Передача матрицы изображения по сети»

textual
Листинг программы
try
            {
                var tl = new TcpListener(IPAddress.Parse("192.168.0.91"), 80);
                tl.Start();
                var client = tl.AcceptTcpClient();
 
                using (var ns = client.GetStream())
                using (var br = new BinaryReader(ns))
                {
                    while (true)
                    {
                    //принимаем размер пакета
                    count = br.ReadInt32();
                    //принимаем пакет
                    byte[] data = br.ReadBytes(count); //Точка отановки процесса.
                    //разжимаем данные
                    data = DeCompress(data);
                    //отправляем данные в очередь принятых данных
                    lock (incomingData)
                        incomingData.EnqueueRange(data);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы