Mat norm_digit(Mat& src)
{
CV_Assert(!src.empty() && src.type() == CV_8UC1);
// 1. 이미지 이진화
Mat src_bin;
threshold(src, src_bin, 0, 255, THRESH_BINARY | THRESH_OTSU);
// 2. labeling을 통해 이미지 무게중심을 centroids로 받음
Mat labels, stats, centroids;
int n = connectedComponentsWithStats(
src_bin, labels, stats, centroids
);
// 3. 영상 크기에 대한 중심점까지 이동해야 할 dx, dy 추출
Mat dst = Mat::zeros(src.rows, src.cols, src.type());
for (int i = 1; i < n; i++) {
if (stats.at<int>(i, 4) < 10) continue;
int cx = cvRound(centroids.at<double>(i, 0));
int cy = cvRound(centroids.at<double>(i, 1));
double dx = 10 - cx;
double dy = 10 - cy;
// 4. 이동 변환을 통해 이미지 수정
Mat warpMat = (Mat_<double>(2, 3) << 1, 0, dx, 0, 1, dy);
warpAffine(src, dst, warpMat, dst.size());
}
return dst;
}