RAW8 pixel format to QImage. A little problem...
-
@Insidious_Snot No, QPalette is for the window system. What I'm saying you should look at the documentation of Image::Convert( PIXEL_FORMAT_RAW8, &newImg ) and figure what it creates. Chances are it creates a gray-scaled 8-bit indexed image (in this case your code is right) or it creates a colored 8-bit indexed image in which case it should provide you with the palette that is being used.
We have no clue where this Image class comes from :) -
@codebit the reference for PIXEL_FORMAT_RAW8 at camera's API is;
PIXEL_FORMAT_RAW8 = 0x00400000, /**< 8 bit raw data output of sensor. */
Also full description for Image::Convert(...) is;
* Converts the current image buffer to the specified output format and * stores the result in the specified image. The destination image * does not need to be configured in any way before the call is made. * * @param format Output format of the converted image. * @param pDestImage Destination image. * * @return An Error indicating the success or failure of the function. */ virtual Error Convert( PixelFormat format, Image* pDestImage ) const;
The camera constructor makes clear that I can use it's full resolution only with that pixel format. As I see in the test program that come with the device, the pix format is RAW8 and I have color image.
Forthwith I tried to make the conversion to RGB format (RGB for Camera's API 24bit and RGB888 for Qt) and I have the live image in resolution I want but in very low frame rate which caused by data processing and not from camera setting.
@Leonardo thanks for your help and your code ;). Unfortunately it doesn't works. It appears the image above:
Of course I didn't use your code block unchanged but I made the suitable mods in order to work correctly with the rest code. Take a look here;
uchar* output = (uchar*) malloc(width*height*4); int in_size = width*height*3; int j; for(int i = 0 , j = 0 ; i < in_size ; i += 3, j+= 4) { output[j] = (uchar)newImg[i]; output[j+1] = (uchar)newImg[i+1]; output[j+2] = (uchar)newImg[i+2]; output[j+3] = 0; } (*grabedFrame) = img.copy();```
-
Hi. Since you're using a 8bit image, your input is 1 byte per pixel. So:
uchar* output = (uchar*) malloc(width*height*4); int in_size = width*height; int j; for(int i = 0 , j = 0 ; i < in_size ; i++, j+= 4) { output[j] = (uchar)newImg[i]; output[j+1] = 0; output[j+2] = 0; output[j+3] = 0; }
-
@Leonardo it returns me that now ;
http://bit.ly/1LJPXIouchar* output = (uchar*) malloc(width*height*4); int in_size = width*height; int j; for(int i = 0 , j = 0 ; i < in_size ; i++, j+= 4) { output[j] = (uchar)newImg[i]; output[j+1] = 0; output[j+2] = 0; output[j+3] = 0; } QImage img(output, width, height, QImage::Format_RGB32, free, output); (*grabedFrame) = img.copy();
-
Oh, I see the constructors available for Qt 4.8 are different. The one in my code is for Qt 5.5. I didn't know this one in which you can specify the number of bytes per line. You were right from the start. Your first code should work, according to the documentation.
QImage tmpImg( (uchar *)newImg.GetData(), width, height, width, QImage::Format_Indexed8);
I'm interested in this issue. Would you mind dumping your raw data to a file and posting it here? I'd like to try it later.
-
uchar* output = (uchar*) malloc(width*height*4); int in_size = width*height; int j; for(int i = 0 , j = 0 ; i < in_size ; i++, j+= 4) { output[j] = (uchar)newImg[i]; output[j+1] = 0; output[j+2] = 0; output[j+3] = 0; } QImage img(output, width, height, width, QImage::Format_RGB32, free, output); (*grabedFrame) = img.copy();
And returns me that : http://bit.ly/1L0fHzz
Of course! I would try to get it now...
-
@Leonardo here is the Raw8 data : http://bit.ly/1WtnXMg
I have put spaces and lines in order to make it easier to read. Each line has length == columns/2 (cause the spaces I put).
-
Hi. Well, it's working. Here's what I've done:
QFile f("D:/img.bin"); if(f.open(QIODevice::ReadOnly)){ QByteArray b = f.readAll(); QImage img((const uchar*) b.constData(), 4096, 2160, 4096, QImage::Format_Indexed8); QVector<QRgb> colorTable; for (int i = 0; i < 256; i++){ colorTable.push_back(qRgb(i,i,i)); } img.setColorTable(colorTable); img.save("D:/img.png"); f.close(); }
And here's what I got: