react-native-opencv-tutorial
react-native-opencv-tutorial copied to clipboard
QR code detector
Can you please have a look at the below code and see if there are any reasons why this would not detect a QR code when a photo is taken? for the detectAndDecode method it returns an empty string and detect method it returns 0.
RCT_EXPORT_METHOD(checkForQRCode:(NSString )imageAsBase64) { RCTLog(@"%@", imageAsBase64); UIImage image = [self decodeBase64ToImage:imageAsBase64];
cv::QRCodeDetector qrDecoder = cv::QRCodeDetector();
BOOL isQRPresentResult = [self isQRPresent:image];
NSString *decodedQrData = [self decodeQRCode:image]; //BOOL isQRPresentResult = 1;
//std::string data = qrDecoder.detectAndDecode(matImage); //std::string data = "testing";
//NSString* result = [NSString stringWithUTF8String:data.c_str()]; //NSString* result = @"test"; RCTLogInfo(@"Pretending to create an event %@", decodedQrData); RCTLog(isQRPresentResult ? @"yes" : @"No"); };
-(BOOL)isQRPresent:(UIImage*)image{
cv::Mat matImage = [self convertUIImageToCVMat:image]; cv::Mat matImageGrey; // converting image's color space (RGB) to grayscale cv::cvtColor(matImage, matImageGrey, cv::COLOR_BGRA2GRAY); std::vectorcv::Point points;
cv::QRCodeDetector qrDecoder = cv::QRCodeDetector(); return qrDecoder.detect(matImageGrey, points);
}; -(NSString*)decodeQRCode:(UIImage*)image{
cv::Mat matImage = [self convertUIImageToCVMat:image]; cv::Mat matImageGrey; // converting image's color space (RGB) to grayscale cv::cvtColor(matImage, matImageGrey, cv::COLOR_BGRA2GRAY);
cv::QRCodeDetector qrDecoder = cv::QRCodeDetector(); std::string qrData; qrData = qrDecoder.detectAndDecode(matImageGrey); return [NSString stringWithUTF8String:qrData.c_str()];
};
-
(cv::Mat)convertUIImageToCVMat:(UIImage *)image { CGColorSpaceRef colorSpace = CGImageGetColorSpace(image.CGImage); CGFloat cols = image.size.width; CGFloat rows = image.size.height;
cv::Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels (color channels + alpha)
CGContextRef contextRef = CGBitmapContextCreate(cvMat.data, // Pointer to 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), image.CGImage); CGContextRelease(contextRef);
return cvMat; };
-
(UIImage *)decodeBase64ToImage:(NSString *)strEncodeData { NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters]; return [UIImage imageWithData:data]; };