[osg-users] Convertion to osg::Image from IplImage (OpenCV) for useas texture

John Steinbis jsteinbis at gmail.com
Mon Sep 17 11:04:04 PDT 2007


Thank you everyone for replies to my problem...
Bill's code was instructive by showing that the basic idea behind what
I was trying to do was correct. My old method (and Bill's) would
attempt to perform a deep copy. In this method, I'd simply forgotten
to initialize something before using it. Sorry! My new method performs
a shallow copy and is working now, with very little code required.
I've posted it below.

-- John


osg::Image* Convert_OpenCV_TO_OSG_IMAGE(IplImage* cvImg)
{

	if(cvImg->nChannels == 3)
	{
		// Flip image from top-left to bottom-left origin
		if(cvImg->origin == 0) {
			cvConvertImage(cvImg , cvImg, CV_CVTIMG_FLIP);
			cvImg->origin = 1;
		}

		// Convert from BGR to RGB color format
		//printf("Color format %s\n",cvImg->colorModel);
		cvCvtColor( cvImg, cvImg, CV_BGR2RGB );

		osg::Image* osgImg = new osg::Image();

		osgImg->setImage(
			cvImg->width, //s
			cvImg->height, //t
			3, //r
			3, //GLint internalTextureformat, (GL_LINE_STRIP, 0x0003)
			6407, // GLenum pixelFormat, (GL_RGB, 0x1907)
			5121, // GLenum type, (GL_UNSIGNED_BYTE, 0x1401)
			(BYTE*)(cvImg->imageData), // unsigned char* data
			osg::Image::AllocationMode::NO_DELETE // AllocationMode mode (shallow copy)
			);//int packing=1); (???)

		//printf("Conversion completed\n");
		return osgImg;
	}
	else {
		printf("Unrecognized image type");
		return 0;
	}

}




On 9/17/07, Poirier, Guillaume <Guillaume.Poirier at nrc-cnrc.gc.ca> wrote:
>
> Hi John,
>
> I wrote a osgImage2IplImage, not sure if it could help you, but here it is:
>
> /*! Image conversion functions
>     Utility functions to convert between different image representations */
> IplImage* osgImage2IplImage(const osg::Image& p_osgImage)
> {
>   const unsigned char *buffer = p_osgImage.data();
>
>   IplImage* pImg = cvCreateImage(cvSize(p_osgImage.s(), p_osgImage.t()), IPL_DEPTH_8U, p_osgImage.r() );
>
>   if(p_osgImage.r() == 3)
>   {
>     struct pixelStruct { unsigned char r, g, b; };
>     struct pixelStruct* pPixel = ( struct pixelStruct * ) ( buffer );
>     struct pixelStruct* pCurrentPixel = NULL;
>     for(int x = 0; x < p_osgImage.s(); x++ ) {
>       for(int y = 0; y < p_osgImage.t(); y++ ) {
>         pCurrentPixel = &pPixel[ y * p_osgImage.s() + x ];
>         int invertedY = p_osgImage.t()-1-y;
>         // blue
>         ((uchar*)(pImg->imageData + pImg->widthStep*invertedY))[x*3] = pCurrentPixel->b;
>         // green
>         ((uchar*)(pImg->imageData + pImg->widthStep*invertedY))[x*3+1] = pCurrentPixel->g;
>         // red
>         ((uchar*)(pImg->imageData + pImg->widthStep*invertedY))[x*3+2] = pCurrentPixel->r;
>       }
>     }
>   }
>   else if(p_osgImage.r() == 4)
>   {
>     struct pixelStruct { unsigned char r, g, b, a; };
>     struct pixelStruct* pPixel = ( struct pixelStruct * ) ( buffer );
>     struct pixelStruct* pCurrentPixel = NULL;
>     for(int x = 0; x < p_osgImage.s(); x++ ) {
>       for(int y = 0; y < p_osgImage.t(); y++ ) {
>         pCurrentPixel = &pPixel[ y * p_osgImage.s() + x ];
>         int invertedY = p_osgImage.t()-1-y;
>         // alpha
>         ((uchar*)(pImg->imageData + pImg->widthStep*invertedY))[x*3] = pCurrentPixel->a;
>         // blue
>         ((uchar*)(pImg->imageData + pImg->widthStep*invertedY))[x*3+1] = pCurrentPixel->b;
>         // green
>         ((uchar*)(pImg->imageData + pImg->widthStep*invertedY))[x*3+2] = pCurrentPixel->g;
>         // red
>         ((uchar*)(pImg->imageData + pImg->widthStep*invertedY))[x*3+3] = pCurrentPixel->r;
>       }
>     }
>   }
>   else
>   {
>     osg::notify(osg::NOTICE)<<"osgImage2IplImage: Error, unrecognized image depth."<<std::endl;
>   }
>
>   return pImg;
> }
>
>
>
> bill
>
>
> -----Original Message-----
> From: osg-users-bounces at lists.openscenegraph.org on behalf of John Steinbis
> Sent: Sun 9/16/2007 9:23 PM
> To: OpenSceneGraph Users
> Subject: [osg-users] Convertion to osg::Image from IplImage (OpenCV) for useas texture
>
> Hi,
> I'm trying to convert an IplImage (OpenCV) type to osg::Image type for
> use as a texture within OSG. My conversion routine attempts to utilize
> setImage(...) of image class. It crashes and I havent been able to
> track down the problem.
>
> Does anyone have experience with a conversion like this or advise
> about building osg images from other types? Thank you!
>
> -- John
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
> _______________________________________________
> osg-users mailing list
> osg-users at lists.openscenegraph.org
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
>
>



More information about the osg-users mailing list