Sinds kort ben ik bezig met een project voor het ontwikkelen van een vision applicatie voor robot. Voor het vision gedeelte maak ik gebruik van OpenCV. Bij mijn applicatie wou ik natuurlijk een mooie Grafische User Interface. OpenCV heeft natuurlijk zijn eigen GUI namelijk highgui maar deze is vrij beperkt. Daarom ging ik op zoek naar een ander User Interface framework en kwam uiteindelijk terecht bij het Qt framework.
Het enige probleem was wel de OpenCV en Qt hun afbeeldingdata intern anders voorstellen. Na een moeilijke zoektocht op internet heb ik uiteindelijk twee functies die een QImage naar een IplImage converteren en omgekeerd. Dus om jullie al dit zoekwerk te besparen post ik hier de functies:
QImage naar IplImage
IplImage* QImage2IplImage(QImage *qimg) { IplImage *imgHeader = cvCreateImageHeader( cvSize(qimg->width(), qimg->height()), IPL_DEPTH_8U, 4); imgHeader->imageData = (char*) qimg->bits(); uchar* newdata = (uchar*) malloc(sizeof(uchar) * qimg->byteCount()); memcpy(newdata, qimg->bits(), qimg->byteCount()); imgHeader->imageData = (char*) newdata; //cvClo return imgHeader; }
IplImage naar QImage
QImage* IplImage2QImage(IplImage *iplImg){ int h = iplImg->height; int w = iplImg->width; int channels = iplImg->nChannels; QImage *qimg = new QImage(w, h, QImage::Format_ARGB32); char *data = iplImg->imageData; <blockquote>for (int y = 0; y < h; y++, data += iplImg->widthStep) { for (int x = 0; x < w; x++) { char r, g, b, a = 0; if (channels == 1) { r = data[x * channels]; g = data[x * channels]; b = data[x * channels]; } else if (channels == 3 || channels == 4) { r = data[x * channels + 2]; g = data[x * channels + 1]; b = data[x * channels]; } if (channels == 4) { a = data[x * channels + 3]; qimg->setPixel(x, y, qRgba(r, g, b, a)); } else { qimg->setPixel(x, y, qRgb(r, g, b)); } } } return qimg; }
Hopelijk werken deze functie bij jullie even goed dan dat ze bij mij werkten 😉