osg编译的时候,似乎只要没有勾png,就无法读取png图像么?
所以就只好用opencv先读进来,然后传给osg。代码如下:
#include<osgViewer/Viewer>
#include<osgDB/ReadFile>
#include<osgDB/WriteFile>
#include<osg/Geode>
#include<iostream>
#include<osg/DrawPixels>
#include<osg/Texture2D>
#include"FunctionHead.h"
#include"OSGInclude.h"
//opencv
//利用opencv读取图像
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
osg::ref_ptr<osg::Image> 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<osg::DrawPixels> bitmap1 = new osg::DrawPixels;
osg::ref_ptr<osg::DrawPixels> bitmap2 = new osg::DrawPixels;
osg::ref_ptr<osg::DrawPixels> 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<osg::Image> image = CVMat_2_OSGImage(cvMat1);
osg::ref_ptr<osg::Image> image2 = CVMat_2_OSGImage(cvMat2);
osg::ref_ptr<osg::Image> image3 = CVMat_2_OSGImage(cvMat3);
osgDB::writeImageFile(*image3, "osgframe.bmp");//写文件
bitmap1->setImage(image);
bitmap2->setImage(image2);
bitmap3->setImage(image3);
osg::ref_ptr<osg::Geode> 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();
}
似乎是显示出来了,首先放效果。效果如下:
问题:1。当加载多张图片的时候,就会报错,似乎是内存访问错误
问题:2。显示的图片是反过来的,应该是opencv和opengl默认的图片原点位置不同导致的。
目前,内存报错还不知道是由什么引起的。继续学习。