Sto cercando di utilizzare la funzione di rilevamento di persone in OpenCV:CGBitmapContextCreate per CV_8UC3 (da utilizzare in OpenCV)
cv::HOGDescriptor hog;
hog.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());
std::vector<cv::Rect> found;
hog.detectMultiScale(noMask, found, 0.2, cv::Size(8,8), cv::Size(16,16), 1.05, 2);
Ma ottengo il seguente asserzione:
OpenCV Error: Assertion failed (img.type() == CV_8U || img.type() == CV_8UC3) in computeGradient, file /Users/robin/Projects/OpenCVForiPhone/opencv/opencv/modules/objdetect/src/hog.cpp, line 174
e ha senso perché Sto passando un'immagine CV_8UC4.
Quindi ho indovinato che dovrei creare un cvmat con queste caratteristiche. In questo momento ho questi 2 metodi. che mi permettono di ottenere grigi oa colori cvmats (CV_8UC1/CV_8UC4)
Per Colore:
-(cv::Mat)CVMat
{
CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;
cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to backing data
cols, // Width of bitmap
rows, // Height of bitmap
8, // Bits per component
cvMat.step[0], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);
return cvMat;
}
Per Scala di grigi:
-(cv::Mat)CVGrayscaleMat
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;
cv::Mat cvMat = cv::Mat(rows, cols, CV_8UC1); // 8 bits per component, 1 channel
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to backing data
cols, // Width of bitmap
rows, // Height of bitmap
8, // Bits per component
cvMat.step[0], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNone |
kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
return cvMat;
}
e questa è la mia ipotesi di fare 3 canali:
-(cv::Mat)CVMat3Channels
{
//CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;
cv::Mat cvMat(rows, cols, CV_8UC3); // 8 bits per component, 3 channels
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to backing data
cols, // Width of bitmap
rows, // Height of bitmap
8, // Bits per component
cvMat.step[0], // Bytes per row
colorSpace, // Colorspace
kCGImageAlphaNoneSkipLast |
kCGBitmapByteOrderDefault); // Bitmap info flags
CGContextDrawImage(contextRef, CGRectMake(0, 0, cols, rows), self.CGImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
return cvMat;
}
ma ottengo il seguente errore:
<Error>: CGBitmapContextCreate: invalid data bytes/row: should be
at least 9792 for 8 integer bits/component, 3 components,
kCGImageAlphaNoneSkipLast.
<Error>: CGContextDrawImage: invalid context 0x0
Quindi la mia domanda è: qual è il modo corretto di creare un CGBitmapContext compatibile 8UC3? (presumo che l'8UC3 significhi 8 bit per pixel con canali RGB)
Grazie.
PD: il codice di trasformazione dell'immagine è di Robin Summerhill.
Ciao questo è il risultato: – Pochi
cols: 2448.000000, righe: 3264.000000, 7344, Ma non capisco, questa funzione funziona per i miei altri formati. Questa immagine proviene dall'iPhone. – Pochi
Qualcosa di strano sta succedendo qui ... Il passo di 7344 è esattamente 2448.0 * 3. Quindi, sembra che le colonne e le righe vengano scambiate da qualche parte. Anche se, non sembra dal tuo codice. Qualcosa come l'inclinazione dello schermo si verifica causando la trasposizione delle dimensioni? – mevatron