我需要使用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));
}
}
答案 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));