Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV:将图像转换为C++;排列 我想在OpenCV中读取一个3通道RGB图像,并将其转换成一个线性C++浮点数组。听起来很简单,但我仍在努力。我用这个代码试过了,但出于某种原因,它给了我一个分段错误 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 rgb_图像; cv::imread(filename.c_str(),cv::imread_COLOR).convertTo(rgb_图像,cv_32FC3,(1./255)); float*rgb_data=新浮点(rgb_image.rows*rgb_image.cols*rgb_image.channels()); int计数器=0; 对于(intz=0;z >,C++的数组会有类似的可能吗? 输出尺寸应为[行x列x通道]_C++_Opencv - Fatal编程技术网

OpenCV:将图像转换为C++;排列 我想在OpenCV中读取一个3通道RGB图像,并将其转换成一个线性C++浮点数组。听起来很简单,但我仍在努力。我用这个代码试过了,但出于某种原因,它给了我一个分段错误 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 rgb_图像; cv::imread(filename.c_str(),cv::imread_COLOR).convertTo(rgb_图像,cv_32FC3,(1./255)); float*rgb_data=新浮点(rgb_image.rows*rgb_image.cols*rgb_image.channels()); int计数器=0; 对于(intz=0;z >,C++的数组会有类似的可能吗? 输出尺寸应为[行x列x通道]

OpenCV:将图像转换为C++;排列 我想在OpenCV中读取一个3通道RGB图像,并将其转换成一个线性C++浮点数组。听起来很简单,但我仍在努力。我用这个代码试过了,但出于某种原因,它给了我一个分段错误 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 rgb_图像; cv::imread(filename.c_str(),cv::imread_COLOR).convertTo(rgb_图像,cv_32FC3,(1./255)); float*rgb_data=新浮点(rgb_image.rows*rgb_image.cols*rgb_image.channels()); int计数器=0; 对于(intz=0;z >,C++的数组会有类似的可能吗? 输出尺寸应为[行x列x通道],c++,opencv,C++,Opencv,有人知道出了什么问题吗? 有更简单的方法吗? 我知道有一个将 CV::Mat < /C> >转换成 STD::vector < /C> >,C++的数组会有类似的可能吗? 输出尺寸应为[行x列x通道]您有两个问题: 由rafix07指出:使用[]而不是() (i,j)[z]给出的是3个浮点数,而不是1个浮点数 我建议使用 float*rgb_data=new float(rgb_image.rows*rgb_image.cols*rgb_image.channels());//Dst float

有人知道出了什么问题吗?
有更简单的方法吗?
我知道有一个将<代码> CV::Mat < /C> >转换成<代码> STD::vector < /C> >,C++的数组会有类似的可能吗? 输出尺寸应为
[行x列x通道]

您有两个问题:

  • 由rafix07指出:使用[]而不是()

  • (i,j)[z]给出的是3个浮点数,而不是1个浮点数

  • 我建议使用


    float*rgb_data=new float(rgb_image.rows*rgb_image.cols*rgb_image.channels());//Dst
    float*dataPointer=reinterpret_cast(rgb_image.data);//Src
    //来自的指针,指针2,大小(字节)
    std::memcpy(rgb_数据、数据指针、rgb_image.rows*rgb_image.cols*rgb_image.channels()*sizeof(float));
    

    它经过优化,可能比循环更好:)

    float*rgb_data=newfloat(rgb_image.rows*rgb_image.cols*rgb_image.channels())创建了一个对象,而不是数组,使用[]代替()。该死的它是这样一个愚蠢的错误:P.,我的C++技能真的变软了:-/。谢谢!谢谢不幸的是,这似乎具有不同的数据顺序。我假设它是[Channels x Rows x Cols],我必须检查一下。否则,这是一个很好的方法来避免loop@mcExchange谢谢你的错误更正:)我习惯于使用src、dest的OpenCV函数。顺序是RGB RGB RGB。。。在行主修。。。所以它复制了每个像素的3个值,如果你想按另一个顺序。。。那么循环可能是better@mcExchange我想,但我还没有尝试过,就是使用这个函数。这将在单个cv::mat中划分通道,因此顺序为蓝色图像、绿色图像和红色图像(假设为BGR)。我没有尝试过的是传递float数组而不是cv mat的向量,但它可能会起作用。
    cv::split(rgb_图像,rgb_数据)
    cv::split行中的某些内容似乎无法将数组用作目标。不管怎么说,我现在就坚持循环。还是谢谢你的帮助!
    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));