如何在c++中将SFML图像转换为OpenCV格式

how to convert SFML image to OpenCV mat in C++?

本文关键字:转换 OpenCV 格式 图像 SFML c++ 中将      更新时间:2023-10-16

下面的代码用于将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);

更新:我引用了这篇文章,但仍然无法转换。

    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);

这段代码为我工作:

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,而不是在像素的内存中。