【问题标题】:how to convert SFML image to OpenCV mat in C++?如何在 C++ 中将 SFML 图像转换为 OpenCV mat?
【发布时间】:2017-02-10 11:33:36
【问题描述】:

以下代码用于将 OpenCV Mat 图像转换为 SFML 图像。如何将 SFML 图像转换回 Mat 图像?

    cv::Mat frameBGR, frameBGRA;
    sf::Image image;
    cv::cvtColor(frameBGR, frameRGBA, cv::COLOR_BGR2RGBA);
    image.create(frameRGBA.cols, frameRGBA.rows, frameRGBA.ptr());

如果纹理或精灵无法转换为 OpenCV Mat,那么是否可以将 sf::Image 转换为 OpenGL 并将其转换回 cv::Mat

    sf::Texture texture;
    sf::Event event;
    sf::Sprite sprite;
    texture.loadFromImage(image);
    sprite.setTexture(texture);

更新:我推荐了this 帖子,但仍然无法转换。

    void* buffer = ℑ 
    cv::Mat image_mat = cv::Mat(cvSize(500, 500),CV_8UC4, buffer, cv::Mat::AUTO_STEP);  
    cvtColor(image_mat, converted,CV_RGBA2BGR);

它在下面的代码行崩溃(当我显示图像时)

imshow("img", converted);

【问题讨论】:

    标签: c++ opencv opengl image-processing sfml


    【解决方案1】:

    这段代码对我有用:

    cv::Mat sfml2opencv(const sf::Image& img){
        //get size from image
        cv::Size size(img.getSize().x, img.getSize().y);
        //create a mat on image memory
        cv::Mat mat(size,CV_8UC4, (void*)img.getPixelsPtr(), cv::Mat::AUTO_STEP);
        //make SFML RGBA to OpenCV BGRA
        cv::cvtColor(mat, mat, cv::COLOR_RGBA2BGRA);
        //clone mat to avoid memory editing on image memory
        return mat.clone();
    }
    

    您的代码崩溃是因为您尝试在 sf::Image 对象的内存而不是像素的内存上创建 cv::Mat。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-01
      • 2020-09-15
      • 2014-09-22
      • 1970-01-01
      • 2022-06-25
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多