3

事前にお読みいただきありがとうございます。

私はクレジット カード OCR 関連のプロジェクトを行っています。その 1 つのステップでは、既に輪郭が描かれた画像に色を塗りつぶす必要があります。

サンプル画像は次のとおりです。

私の目標は、空白を黒く塗りつぶすことです。

簡単に思えますが、満足のいく解決策を見つけることができませんでした。

この機能を試してfindContoursみましたが、非常にわかりにくいことがわかりました。次の関数を実行した後:

findContours( cvMatImage, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );

奇妙なことに、輪郭点が正しく抽出されなかっただけでなく、元の入力画像自体の色が反転しているように見えました。

目標を達成する方法、またはfindContours機能を正しく使用する方法に関する意見は大歓迎です。

アップデート:

親切なご意見ありがとうございます。

実際、私の質問に含まれる画像は既に二値化されています。また、画像に「適応しきい値処理」手順を適用しました。

元の画像は次のようになります。http://i.stack.imgur.com/DkIKt.png

CGColorSpaceRef colorSpace = CGImageGetColorSpace(self.CGImage);
CGFloat cols = self.size.width;
CGFloat rows = self.size.height;

Mat cvMat(rows, cols, CV_8UC4); // 8 bits per component, 4 channels

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), self.CGImage);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);

Mat cvImage_gray, cvImage_threshold;

cvtColor(cvImageOrg, cvImage_gray, CV_RGB2GRAY); //Binarize

adaptiveThreshold(cvImage_gray, cvImage_threshold, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, neighbor, threshRed); //Adaptive threshold
4

1 に答える 1