osg结合opencv显示图像

osg编译的时候,似乎只要没有勾png,就无法读取png图像么?

所以就只好用opencv先读进来,然后传给osg。代码如下:

#include 
#include
#include
#include
#include
#include
#include
#include"FunctionHead.h"
#include"OSGInclude.h"

//opencv
//利用opencv读取图像
#include
#include
#include

osg::ref_ptr CVMat_2_OSGImage(cv::Mat& cvimg)
{
    osg::Image osgframe2();
    osg::Image* osgframe = new osg::Image();
    osgframe->setImage(cvimg.cols, cvimg.rows, 3,
        GL_BGR, GL_BGR, GL_UNSIGNED_BYTE, cvimg.data,
        osg::Image::NO_DELETE, 1);
    return osgframe;
}

int NinOsg_DrawPicture()
{
    osg::ref_ptr bitmap1 = new osg::DrawPixels;
    osg::ref_ptr bitmap2 = new osg::DrawPixels;
    osg::ref_ptr bitmap3 = new osg::DrawPixels;
    bitmap1->setPosition(osg::Vec3(0.0, 0.0, 0.0));
    bitmap2->setPosition(osg::Vec3(80.0, 0.0, 0.0));
    bitmap3->setPosition(osg::Vec3(200.0, 0.0, 0.0));
    //bitmap3->setUseSubImage(true);
    //bitmap1->setImage(osgDB::readImageFile("..\\OpenSceneGraph-Data\\Images\\osg64.png"));
    cv::Mat cvMat1 = cv::imread("..\\OpenSceneGraph-Data\\Images\\osg64.png");
    cv::Mat cvMat2 = cv::imread("..\\OpenSceneGraph-Data\\Images\\osg128.png");
    cv::Mat cvMat3 = cv::imread("..\\OpenSceneGraph-Data\\66.png");
    osg::ref_ptr image = CVMat_2_OSGImage(cvMat1);
    osg::ref_ptr image2 = CVMat_2_OSGImage(cvMat2);
    osg::ref_ptr image3 = CVMat_2_OSGImage(cvMat3);
    osgDB::writeImageFile(*image3, "osgframe.bmp");//写文件

    bitmap1->setImage(image);
    bitmap2->setImage(image2);
    bitmap3->setImage(image3);
    osg::ref_ptr geode = new osg::Geode();

    //geode->addDrawable(bitmap1.get());
    //geode->addDrawable(bitmap2.get());
    geode->addDrawable(bitmap3.get());
    
    osgViewer::Viewer viewer;
    viewer.setSceneData(geode.get());
    return viewer.run();
}

似乎是显示出来了,首先放效果。效果如下:

osg结合opencv显示图像_第1张图片

问题:1。当加载多张图片的时候,就会报错,似乎是内存访问错误

问题:2。显示的图片是反过来的,应该是opencv和opengl默认的图片原点位置不同导致的。

osg结合opencv显示图像_第2张图片

目前,内存报错还不知道是由什么引起的。继续学习。

你可能感兴趣的:(osg学习)