を使用して文字をセグメント化しています
adaptiveThreshold(crops_gray, crops_gray_resized, 255,
CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY_INV,121,-35);
私も使っています
adaptiveThreshold(crops_gray, thresh, 255,
CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 81,-80);
問題は、一部の画像でBINARY_INV
はパラメータを設定するまでクラッシュし81,-35
、一部の画像では同じ問題ですBINARY
たとえば、最初の「上」の画像は、BINARY
set to81,-35
およびBINARY_INV
toの結果を示しています。81,-80
BINARY
to121,-35
とBINARY_INV
toを変更すると81,-80
、画像の 2 番目の行が表示されます -> 2 番目の画像でエラーなしでクラッシュします
BINARY_INV
to81,-35
とBINARY
to を変更すると121,-80
、最後の画像になります
自分が何をしているのかをより明確にするためのコードを提供しています。
for (int k = 0; k < j; k++) {
cvtColor(crops[k], crops_gray, CV_RGB2GRAY);
imshow("Crops_gray", crops_gray);
Mat crops_gray_resized;
resize(crops_gray, crops_gray, cvSize(160, 80));
crops_gray_resized=crops_gray;
imshow("img_rotated_resized ", crops_gray);
Mat thresh;
imshow("crops_eq ", crops_gray);
adaptiveThreshold(crops_gray, crops_gray_resized, 255,
CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY_INV,121,-35);
adaptiveThreshold(crops_gray, thresh, 255,
CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 81,-80);
imshow("crops_thresh ", crops_gray_resized);
findContours(thresh, contours, hierarchy, CV_RETR_TREE,
CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<Point2f> ContArea(contours.size());
for (int i = 0; i < contours.size(); i++) {
approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);
boundRect[i] = boundingRect(Mat(contours_poly[i]));
}
min = 0.0;
float avg=0;
float elem=0;
int num=0;
for (int i = 0; i < contours.size(); i++) {
double a = contourArea(contours[i]);
ratio = (float) boundRect[i].width / (float) boundRect[i].height;
if ((a >= 40 && a < 800) && ((ratio >= min) && (ratio < 2))
) {
elem=elem+(float)boundRect[i].height;
num++;
}
}
avg=(elem/(num));
printf("avg: %f",avg);
imshow("crops_thresh? ", thresh);
int l =0;
/// Draw polygonal contour + bonding rects
Mat drawing5 = Mat::zeros(crops_gray_resized.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255),
rng.uniform(0, 255));
double a = contourArea(contours[i]);
ratio = (float) boundRect[i].width / (float) boundRect[i].height;
if ((a >= 40 && a < 400) && ((ratio >= min) && (ratio < 2))
&& (float)boundRect[i].height > avg) {
printf(" a: %f ratios: %f image%d height: %d \n", a, ratio, i,
boundRect[i].height);
drawContours(drawing5, contours_poly, (int) i, color, 1, 8,
vector<Vec4i>(), 0, Point());
rectangle(drawing5, boundRect[i].tl(), boundRect[i].br(), color,
CV_FILLED, 1, 0);
Mat cropx(crops_gray_resized(boundRect[i]));
crops[l] = cropx;
imshow("crops0", crops[l]);
if (l == 1)
imshow("crops1", crops[l]);
if (l == 2)
imshow("crops2", crops[l]);
if (l == 3)
imshow("crops3", crops[l]);
if (l == 4)
imshow("crops4", crops[l]);
if (l == 5)
imshow("crops5", crops[l]);
if (l == 6)
imshow("crops6", crops[l]);
if (l == 7)
imshow("crops7", crops[l]);
if (l == 8)
imshow("crops8", crops[l]);
l++;
}
}
imshow("Rectangles5", drawing5);
waitKey(0);
}
私は今、何が起こっているのか完全に混乱しています。誰かが私が間違っていることを教えてもらえますか?