Отправить изображение с c ++ в rabbitmq с буфером протокола на c # - PullRequest
0 голосов
/ 29 апреля 2018

Я хочу отправить изображение из проекта c ++ в проект c # с rabbitmq и буфером протокола. Я читаю изображение из файла с opencv и сохраняю его в матрицу. Вопрос в том, как отправить изображение в проект c #? Должен ли я преобразовать матрицу в байтовый массив или в строку? а как объявить тип в проекте c #?

У меня есть LPRResult.proto файл:

syntax = "proto2"
package ProtoBufLPR;

message LPRResult {
   required string LicencsePlate = 1;
   required bytes Image = 2;
}

Прочитайте изображение и отправьте сообщение:

using byte = unsigned char;
int sendMessage() {

 Mat image;
    image = imread("/home/capture4.jpeg", CV_LOAD_IMAGE_COLOR);   // Read the file

    ProtobufLPR::LPRResult lprResult;

    //convert to byte array
    int size = image.total() * image.elemSize();
    byte * bytes = new byte[size];  // you will have to delete[] that later
    std::memcpy(bytes, image.data, size * sizeof(byte));

    lprResult.set_image(bytes, sizeof(byte));

    lprResult.set_licenseplatenumber("1234567");

    SimplePocoHandler handler("10.0.0.6", 5672);

    AMQP::Connection connection(&handler, AMQP::Login("guest", "guest"), "/");
    AMQP::Channel channel(&connection);

    channel.onReady([&]()
    {
        if(handler.connected())
        {

            int size = lprResult.ByteSize();
            char* array = new char[size];
            lprResult.SerializeToArray(array, size);

            channel.publish("", "hello", array);
            std::cout << " [x] Sent 'Hello World!'" << std::endl;
            handler.quit();
        }
    });
}

При отправке таких данных я получаю сообщение об ошибке на c #:

недействительный проводной тип; обычно это означает, что вы перезаписали файл без усечения или установки длины

Мой класс по c #:

using ProtoBuf;
using System;

namespace LPRRabbitMq
{
    [ProtoContract(SkipConstructor = true)]
    public class LPRResult
    {
        [ProtoMember(1)]
        public String LicensePlateNumber { get; set; }

        [ProtoMember(2)]
        public Byte[] Image { get; set; }

    }
}

Это мой код десериализации c #:

using ProtoBuf;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.IO;
using System.Text;


namespace LPRRabbitMq
{
    class Program
    {
        static void Main(string[] args)
        {

            var factory = new ConnectionFactory()
            {
                HostName = "10.0.0.6",
                UserName = "guest",
                Password = "guest",
                VirtualHost = "/",
                Port = 5672
            };

            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello",
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);


                var consumer = new EventingBasicConsumer(channel);
                consumer.Received += (model, ea) =>
                {

                    LPRResult result;

                    using (var stream = new MemoryStream(ea.Body))
                    {
                       result = Serializer.Deserialize<LPRResult>(stream);

                        Console.WriteLine(result.LicensePlateNumber);
                    }

                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    Console.WriteLine(" [x] Received {0}", message);
                };
                channel.BasicConsume(queue: "hello",
                                     autoAck: true,
                                     consumer: consumer);

                Console.WriteLine(" Press [enter] to exit.");
                Console.ReadLine();
            }
        }
    }
}
...