将cv :: Mat存储在字节数组中,以便将数据传输到服务器

时间:2012-10-02 14:25:59

标签: c++ opencv bytearray

我需要使用OpenCV读取图像,获取其大小并将其发送到服务器,以便处理图像并将其提供给我提取的功能。

我一直在考虑使用vector<byte>,但我不明白如何将数据复制到cv :: Mat。我想要快,所以我试图用指针访问数据,但我有一个运行时异常。我有类似的东西。

Mat image = imread((path + "name.jpg"), 0);
vector<byte> v_char;
for(int i = 0; i < image.rows; i++)
    {   
        for(int j = 0; j < image.cols; j++)
        {
            v_char.push_back(*(uchar*)(image.data+ i + j));             

        }           
    }
  • 这项任务的最佳方法是什么?

4 个答案:

答案 0 :(得分:8)

直接访问是一个好主意,因为它是OpenCV最快的,但是您缺少步骤,这可能是您的程序中断的原因。下一行错了:

v_char.push_back(*(uchar*)(image.data+ i + j)); 

您不必增加 i ,您必须增加 i + image.step 。就是这样:

Mat image = imread((path + "name.jpg"), 0);
vector<byte> v_char;
for(int i = 0; i < image.rows; i++)
    {   
        for(int j = 0; j < image.cols; j++)
        {
            v_char.push_back(*(uchar*)(image.data+ i*image.step + j));             

        }           
    }

答案 1 :(得分:6)

改进Jav_Rock的答案就是我将如何做到这一点。

Mat image = ...;
vector<byte> v_char(image.rows * image.cols);

for (int i = 0; i < image.rows; i++)
  memcpy(&v_char[i * image.cols], image.data + i * image.step, image.cols);

编辑:构造函数初始化将分配足够的空间以避免额外的重新分配,但它也会将向量中的所有项目设置为默认值(0)。以下代码避免了这种额外的初始化。

Mat image = ...;
vector<byte> v_char;
v_char.reserve(image.rows * image.cols);

for (int i = 0; i < image.rows; i++)
{
  int segment_start = image.data + i * image.step;
  v_char.insert(v_char.end(), segment_start, segment_start + image.cols);
}

答案 2 :(得分:5)

到目前为止,您已收到很好的答案,但这不是您的主要问题。在向服务器发送图像之前,您可能想要做的 压缩

因此,请查看cv::imencode()如何压缩它,并cv::imdecode()将其转换回服务器中的OpenCV矩阵。只需将imencode ouptut推到套接字即可。

答案 3 :(得分:1)

我完全不明白为什么你需要使用矢量,但如果真的有必要,我建议你做一个简单的memcpy:

vector<byte> v_char(image.width * image.height); //Allocating the vector with the same size of the matrix
memcpy(v_char.data(), image.data, v_char.size() * sizeof(byte));