Я хочу отправить изображение из проекта 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();
}
}
}
}