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 [EMAIL PROTECTED] 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: [EMAIL PROTECTED] 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@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
___
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org