Tôi cố gắng để sử dụng chức năng người phát hiện trong OpenCV:CGBitmapContextCreate cho CV_8UC3 (để sử dụng trong 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);
Nhưng tôi nhận được sự khẳng định sau đây:
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
Và nó có ý nghĩa vì Tôi đang chuyển một hình ảnh CV_8UC4.
Vì vậy, tôi đoán tôi nên tạo một cvmat với đặc điểm này. Ngay bây giờ tôi có 2 phương pháp này. mà cho phép tôi để có được màu xám hoặc màu cvmats (CV_8UC1/CV_8UC4)
Đối Màu sắc:
-(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;
}
Đối với Grayscale:
-(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;
}
Và đây là dự đoán của tôi để làm cho 3 kênh:
-(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;
}
Nhưng tôi nhận được lỗi sau:
<Error>: CGBitmapContextCreate: invalid data bytes/row: should be
at least 9792 for 8 integer bits/component, 3 components,
kCGImageAlphaNoneSkipLast.
<Error>: CGContextDrawImage: invalid context 0x0
Vì vậy, câu hỏi của tôi là, cách chính xác của việc tạo ra một 8UC3 tương thích CGBitmapContext là gì? (Tôi giả sử 8UC3 có nghĩa là 8 bit mỗi pixel với các kênh RGB)
Cảm ơn bạn.
PD: Mã chuyển đổi hình ảnh là từ Robin Summerhill.
Xin chào đây là kết quả: – Pochi
cols: 2448.000000, hàng: 3264.000000, 7344, nhưng tôi không hiểu, chức năng này hoạt động cho các định dạng khác của tôi. Hình ảnh này là từ iphone. – Pochi
Thứ gì đó cá đang diễn ra ở đây ... Bước 7344 chính xác là 2448.0 * 3. Vì vậy, có vẻ như các cột và hàng của bạn đang được đổi chỗ ở đâu đó. Mặc dù, nó không giống như nó từ mã của bạn. Có phải thứ gì đó như độ nghiêng màn hình xảy ra khiến các thứ nguyên chuyển vị? – mevatron