将cv :: Mat图像转换为向量<float>类型时的浮点异常

时间:2015-06-02 11:35:52

标签: opencv floating-point ros

我想将cv:Mat图像保存为矢量类型? 我写了一个函数,但我总是得到错误信息。

#include <ros/ros.h>
    #include <image_transport/image_transport.h>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <cv_bridge/cv_bridge.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <vector>
    #include "opencv2/opencv.hpp"
    using namespace std;

    #ifdef _OPENMP
    #include <omp.h>
    #endif

    # define IM_X 200
    # define IM_Y 200
    //Globale Variablen:
    cv::Mat image;
    cv::Mat resize_image;

    //Funktionen:
    string convertInt(int number);
    vector<float> MatToFloatVec(const cv::Mat& mat) ;

    void imageCallback(const sensor_msgs::ImageConstPtr& msg)
    {
      try
      {
        cv::imshow("view", cv_bridge::toCvShare(msg, "bgr8")->image);
        cv::waitKey(30);
      }
      catch (cv_bridge::Exception& e)
      {
        ROS_ERROR("Could not convert from '%s' to 'CV_32FC1'.", msg->encoding.c_str());
      }
    }

    int main(int argc, char **argv)
    {

        /*
          ROS-Image Subscriber--> siehe Tutorial!!
        */
        ros::init(argc, argv, "image_listener");
        ros::NodeHandle nh;
        cv::namedWindow("view");
        cv::startWindowThread();
        image_transport::ImageTransport it(nh);
        image_transport::Subscriber sub = it.subscribe("/image_raw", 1, imageCallback);

        ROS_INFO_STREAM("Hier vor Grey");
        std::vector<float>test  = MatToFloatVec(image);
    }
    vector<float> MatToFloatVec(const cv::Mat& mat)
    {
        return vector<float>(mat.begin<uchar>(), mat.end<uchar>());
    }

我总是收到错误消息: [INFO] [1433244615.907292392]:Hier vor Gray 浮点异常(核心转储)

问题是什么?

任何人都可以帮助我

2 个答案:

答案 0 :(得分:0)

std::vector<>有两个ctors接受两个值:

  1. 尺寸+默认值。
  2. 开始+结束迭代器。
  3. 您正在传递uchar迭代器,可能需要float个迭代器。

    此外,代码中的哪个位置表示image8UC1

答案 1 :(得分:0)

不,我改变了方法,现在它正在运行。

vector<float> MatToFloatVec(const cv::Mat& mat)
{
    std::vector<float> array;    
    array.assign((float*)mat.datastart, (float*)mat.dataend);
    return array;
}