我想在opencv中读取3通道RGB图像并将其转换为线性C ++浮点数组。听起来很简单,但我仍在努力。我尝试使用此代码,但由于某种原因,它给了我segmentation fault
cv::Mat rgb_image;
cv::imread(filename.c_str(), cv::IMREAD_COLOR).convertTo(rgb_image, CV_32FC3, (1./255.));
float *rgb_data = new float(rgb_image.rows * rgb_image.cols * rgb_image.channels());
int counter = 0;
for (int z = 0; z < rgb_image.channels(); z++)
for (int i = 0; i < rgb_image.rows; i++)
for (int j = 0; j < rgb_image.cols; j++){
rgb_data[counter] = rgb_image.at<cv::Vec3f>(i,j)[z] ;
counter++;
}
有谁看到出了什么问题?
有没有更简单的方法呢?
我知道将cv::Mat
转换为std::vector
有stackoverflow-examples,对C ++数组来说可能类似吗?
输出维度应为[Rows x Cols x Channel]
答案 0 :(得分:1)
你有两个问题:
由rafix07指出:使用[]代替()
rgb_image.at(i,j)[z]给3个花车而不是1
我建议使用std::memcpy
float *rgb_data = new float(rgb_image.rows * rgb_image.cols * rgb_image.channels()); // Dst
float* dataPointer = reinterpret_cast<float*>(rgb_image.data); // Src
// pointer from, pointer two, size in bytes
std::memcpy(rgb_data, dataPointer, rgb_image.rows * rgb_image.cols * rgb_image.channels() * sizeof(float));
它已经过优化,可能比循环更好:)。