Hi,

So far I've been successful in showing the first captured frame using
OpenCV, in OSG.

// IplImage* cvImg is the webcam output image captured using
> cvQueryFrame(capture)
> osg::ref_ptr<osg::Image> osgImage = new osg::Image;
> osgImage->setImage(cvImg->width,cvImg->height, 3,
>                GL_RGB, GL_RGB, GL_UNSIGNED_BYTE,
>                (BYTE*)(cvImg->imageData),
>                osg::Image::AllocationMode::NO_DELETE,1);
>


> osg::ImageStream* imageStream = dynamic_cast<osg::ImageStream*>(
> osgImage.get() );
> if( imageStream ) imageStream->play();
>


> osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D;
> texture->setImage( osgImage.get() );
>


> osg::ref_ptr<osg::Drawable> quad = osg::createTexturedQuadGeometry(
>         osg::Vec3(), osg::Vec3(1.0f, 0.0f, 0.0f), osg::Vec3(0.0f, 0.0f,
> 1.0f) );
> quad->getOrCreateStateSet()->setTextureAttributeAndModes(0,texture.get() );
>


> osg::ref_ptr<osg::Geode> geode = new osg::Geode;
> geode->addDrawable( quad.get() );



But I want the entire webcam stream in OSG, after preprocessing in OpenCV.
After googling I found this answer as a guide:
http://markmail.org/message/txqiv4plykf3bm3r#query:+page:1+mid:txqiv4plykf3bm3r+state:results

According to that I made my Camera class inherit from osg::ImageStream and
called dirty() whenever a new frame is captured. But when I run the program
it crashes! How can I get this to work?

class Camera : public QObject, public *osg::ImageStream*
> {
>     Q_OBJECT
> public:
>     Camera();
>     ~Camera();
>     IplImage* getFrame();
> private:
>     CvCapture* capture;
>     IplImage* frame;
>     int timerId;
> public slots:
>     void timerEvent(QTimerEvent *);
> private slots:
>     void initialize();
> };


Camera::Camera() : QObject(), *osg::ImageStream()*
> {
>     capture = cvCreateCameraCapture(0);
>     frame = cvQueryFrame(capture);
>     QTimer::singleShot(0,this,SLOT(initialize()));
> }
>
> void Camera::initialize(){
>     frame = cvQueryFrame(capture);
>     timerId = startTimer(10);
> }
> void Camera::timerEvent(QTimerEvent *){
>    frame = cvQueryFrame(capture);
>
>    *dirty();*
> }


Thanks
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to