2

Edit: The problem has since been solved, but the root of the problem lies elsewhere, the following is left as-is to help others who might need to do conversions OpenCV<->OSG

In OSG, I have an osg::ImageStream, and an osg::Image. The ImageStream basically stores and plays a pre-recorded video during runtime, while the Image acts as an overlay to present additional information.

The information in this case is processed video information using OpenCV algorithms, and thus I needed to allow OpenCV some form of access to manipulate the Image's data.

I need the Image to be in RGBA format so that unused pixels can be masked out, and this is how I declared the Image:

osg::ref_ptr<osg::Image> opencvOverlay = new osg::Image;
int width = 1920;
int height = 1200;
int size = width*height * 4; //RGBA, 4 channels
unsigned char* data = (unsigned char*)calloc(size, sizeof(unsigned char));
for (long i = 0; i < size; i += 4)
{
    data[i    ] = 0;    //red 
    data[i + 1] = 0;    //green 
    data[i + 2] = 0;    //blue 
    data[i + 3] = 0;    //alpha
}
opencvOverlay->setOrigin(osg::Image::BOTTOM_LEFT);
opencvOverlay->setImage(width, height, 1, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, data, osg::Image::NO_DELETE);

While on the OpenCV side of things, I define a cv::Mat that can manipulate the internal data

IplImage* myIplImage = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 4);
cvSetData(myIplImage, opencvOverlay->data(), width * 4);
cv::Mat* overlay = new cv::Mat(myIplImage);

Such that the variable overlay can be used to output results of OpenCV algorithm.

However, before I proceeded to test any algorithm, i tried to doublecheck whether it is a valid cv::Mat, so I added the following:

cv::imshow("Mat", *overlay);

When the program compile and runs, it exits with the error

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow

Any idea what I'm doing wrong?

1 Answers1

0

You may use cv::cvarrToMat. It is in core.hpp and in the cv:: namespace

cv::Mat overlay = cv::cvarrToMat(myIplImage);
cv::imshow("Mat", overlay);
waitKey(0);
eracube
  • 2,484
  • 2
  • 15
  • 18
  • Thanks for the suggestion.Actually, I traced the problem to a specific OpenCV method, cv::calcOpticalFlowPyrLK(). Which does not accept a zero-initialized std::vector vector for some reason. – Rodson Chue Jun 20 '16 at 07:36