【发布时间】:2016-09-08 04:50:33
【问题描述】:
如何使用 C++ 将每个裁剪提取到单独的图像中? (我的 Opencv 版本 2.4.10)
我已过滤轮廓以匹配所需的车牌尺寸宽度/高度比。 (第三张图片 - 矩形 3)
现在我需要将所有找到的候选者提取到与“i”个候选者具有相同大小的“i”个单独图像中,这样我就可以分割字符并使用 OCR 算法。
此图像的所需输出将是:
两张图片,每张都包含裁剪版本 (理想情况下提取一些额外的宽度/高度,如图所示) 找到的边界框。
这对我来说是有问题的,如果我需要单独的图像,或者我可以简单地使用仅包含裁剪部分(以及所示图像中的黑色背景)的整个图像来分割字符。
我在这里提供我的部分代码:
findContours(crop, 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]));
}
// Draw polygonal contour + filled bonding rects
Mat drawing4 = Mat::zeros(src_gray.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));
rectangle(drawing4, boundRect[i].tl(), boundRect[i].br(), color,
CV_FILLED, 1, 0);
}
imshow("Rectangles4", drawing4);
float ratio;
Mat drawing3 = Mat::zeros(crop.size(), CV_8UC3);
// Draw bonding rects
for (int i = 0; i < contours.size(); i++) {
Scalar color = Scalar(0, 255, 0);
double a = contourArea(contours[i]);
ratio = (float) boundRect[i].width / (float) boundRect[i].height;
//check for min, max size of area and its ratios
if ((a > 200 && a < 2600) && ((ratio >= 1.3) && (ratio <= 10))) {
printf("a: %f ratios: %f", a, ratio);
//drawContours(drawing3, contours_poly, (int) i, color, 1, 8,
vector<Vec4i>(), 0, Point());
rectangle(drawing3, boundRect[i].tl(), boundRect[i].br(), color,
CV_FILLED, 1, 0);
}
}
imshow("Rectangles3", drawing3);
【问题讨论】:
-
对于每个边界框:
Mat cropped_image_i(original_image(bbox)),或者对于深拷贝:Mat cropped_image_i = original_image(bbox).clone() -
这似乎工作得很好!非常感谢!唯一的问题是在显示图像时下一个裁剪似乎与上一个裁剪重叠。是因为我把它展示成这样吗? imshow("crops",crops[j]);经过测试,它仅在 imshow 中显示图像时重叠,我将添加一个答案。 :)