7

我需要使用 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

4 回答 4

9

直接访问是一个好主意,因为它对于 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));             

        }           
    }
于 2012-10-02T14:32:24.890 回答
8

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

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

于 2012-10-03T06:14:51.563 回答
7

改进 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);
}
于 2012-10-02T15:39:35.500 回答
0

我不完全理解你为什么需要使用向量,但如果真的有必要,我建议你做一个简单的 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)); 
于 2012-10-02T15:16:37.960 回答