I have such code that is loading grayscale image from buffer 1byte, 8bits bitmap. Then it resizes this image.
int resizeBitmap(const unsigned char *inData, const size_t inDataLength, const size_t inWidth, const size_t inHeight, const int bitDepth, const int noOfChannels, unsigned char **outData, size_t *outDataLength, const size_t outWidth, const size_t outHeight) { // create input image IplImage *inImage = cvCreateImage(cvSize(inWidth, inHeight), bitDepth, noOfChannels); cvSetData(inImage, inData, inImage->widthStep); // show input image cvNamedWindow("OpenCV Input Image", CV_WINDOW_FREERATIO); cvShowImage("OpenCV Input Image", inImage); cvWaitKey(0); cvDestroyWindow("OpenCV Input Image"); /* */ // create output image IplImage *outImage = cvCreateImage(cvSize(outWidth, outHeight), inImage->depth, inImage->nChannels); // select interpolation type double scaleFactor = (((double) outWidth)/inWidth + ((double) outHeight)/inHeight)/2; int interpolation = (scaleFactor > 1.0) ? CV_INTER_LINEAR : CV_INTER_AREA; // resize from input image to output image cvResize(inImage, outImage, interpolation); /* // show output image cvNamedWindow("OpenCV Output Image", CV_WINDOW_FREERATIO); cvShowImage("OpenCV Output Image", outImage); cvWaitKey(0); cvDestroyWindow("OpenCV Output Image"); */ // get raw data from output image int step = 0; CvSize size; cvGetRawData(outImage, outData, &step, &size); *outDataLength = step*size.height; cvReleaseImage(&inImage); cvReleaseImage(&outImage); return 0; }
I am using here bitDepth = 8 and noOfChannels = 1. Loaded image is:
this output is not always written as program usually fails with error:
OpenCV Error: Bad number of channels (Source image must have 1, 3 or 4 channels) in cvConvertImage, file /tmp/opencv-20160915-26910-go28a5/opencv-2.4.13/modules/highgui/src/utils.cpp, line 611 libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /tmp/opencv-20160915-26910-go28a5/opencv-2.4.13/modules/highgui/src/utils.cpp:611: error: (-15) Source image must have 1, 3 or 4 channels in function cvConvertImage
I am attaching debugger output as there is interesting situation as I am passing grayscale buffer of size 528480 which equals 1 byte * 1101 *480, but after cvCreateImage there is inside imageSize 529920 and widthStep is 1104! Maybe here is the problem with this image, but why it is ?