私の目標は、スキャンした名刺画像からテキスト以外の領域を削除することですが、OpenCVを使用してそれを実行する手順がわかりません。この手順に従いましたが、これが正しいかどうかもわかりません。画像に変更があった場合(テキスト以外の領域が残っている場合)、アイデアは非常に役立ちます。ありがとうございます。
1)画像をグレースケールに変換します
2)画像のバイナリ
3)白いピクセルのテキストにするために色を反転します(cv :: bitwise_not)
4)画像を侵食する(cv :: erode)
5)キャニーを使用してエッジを検出する
6)ハフ変換を使用してテキスト行を検出します(まだ)
コード:
cv::Mat greyMat = [self.imageView.image CVGrayscaleMat];
cv::Mat bwMat;
cv::threshold(greyMat, bwMat, 128, 255, CV_THRESH_BINARY);
cv::bitwise_not(bwMat, bwMat);
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2, 1));
cv::erode(bwMat, bwMat, element);
std::vector<cv::Point>points;
cv::Mat_<uchar>::iterator it=bwMat.begin<uchar>();
cv::Mat_<uchar>::iterator end=bwMat.end<uchar>();
for (; it!=end; ++it)
if (*it)
points.push_back(it.pos());
cv::RotatedRect box=cv::minAreaRect(cv::Mat(points));
plImage* smothedImage=new IplImage(bwMat);
cvSmooth(smothedImage, smothedImage);
cvCanny(smothedImage, smothedImage, 10, 100);