截字符
1.思路
预处理----->边缘检测----->画框
1.预处理
滤波,形态学开、闭操作,膨胀,腐蚀
medianBlur(result, result, 5);
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(result, mask, MORPH_GRADIENT, kernel);//形态学梯度
Canny(mask, canny, 100, 120);
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));
dilate(canny, kernel, element);//膨胀//预处理
Canny(kernel, canny, 100, 120);
bitwise_not(canny,canny);
erode(canny, canny, element);//腐蚀
2.边缘检测canny
效果:

3.画框
for (size_t i = 0; i < contours.size(); ++i) {
Rect rect = boundingRect(contours[i]);
double area = contourArea(contours[i]);
if (area>200&&area<1000) {
rectangle(result, rect, Scalar(0, 255, 0), 2);
}
}
效果:

2.代码
#include <opencv2/opencv.hpp>
void Clear_MicroConnected_Areas(cv::Mat src, cv::Mat &dst, double min_area);
Mat IdentifyLeaves(cv::Mat input);
vector<Mat> read_images_in_folder(cv::String pattern);
cv::String pattern = "D:/photo/books/*.jpg"; // the pattern to match the image file names
glob(pattern, fn, false);
for (size_t i = 0; i < fn.size(); i++)
Mat src = imread(fn[i]); // read the image
if (src.empty()) // check if the image is successfully loaded
cout << "Could not read the image: " << fn[i] << endl;
Mat result = IdentifyLeaves(src);
medianBlur(result, result, 5);
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(result, mask, MORPH_GRADIENT, kernel);//形态学梯度
Canny(mask, canny, 100, 120);
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));
dilate(canny, kernel, element);//膨胀//预处理
Canny(kernel, canny, 100, 120);
bitwise_not(canny,canny);
erode(canny, canny, element);//腐蚀
vector<vector<Point>> contours;
findContours(canny, contours, RETR_CCOMP, CHAIN_APPROX_NONE);
// Draw bounding boxes around the contours
for (size_t i = 0; i < contours.size(); ++i) {
Rect rect = boundingRect(contours[i]);
double area = contourArea(contours[i]);
if (area>200&&area<1000) {
rectangle(result, rect, Scalar(0, 255, 0), 2);
namedWindow("result", WINDOW_KEEPRATIO);
imshow("result", result);
namedWindow("1", WINDOW_KEEPRATIO);
void Clear_MicroConnected_Areas(cv::Mat src, cv::Mat &dst, double min_area)
std::vector<std::vector<cv::Point> > contours; // 创建轮廓容器
std::vector<cv::Vec4i> hierarchy;
cv::findContours(src, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_NONE, cv::Point());
if (!contours.empty() && !hierarchy.empty())
std::vector<std::vector<cv::Point> >::const_iterator itc = contours.begin();
while (itc != contours.end())
cv::Rect rect = cv::boundingRect(cv::Mat(*itc));
double area = contourArea(*itc);
for (int i = rect.y; i < rect.y + rect.height; i++)
uchar *output_data = dst.ptr<uchar>(i);
for (int j = rect.x; j < rect.x + rect.width; j++)
if (output_data[j] == 255)
Mat IdentifyLeaves(cv::Mat input)
CV_Assert(input.channels() == 3);
Mat temp, result, mask, hole;
GaussianBlur(input, temp, Size(5, 5), 0);
threshold(diff, mask, 0, 255, THRESH_OTSU);
cv::Mat element = getStructuringElement(MORPH_ELLIPSE, Size(9, 9));
cv::morphologyEx(mask, mask, MORPH_CLOSE, element);
Clear_MicroConnected_Areas(hole, hole, row*col / 300);
Clear_MicroConnected_Areas(mask, mask, row*col / 300);//除噪点
result.setTo(Scalar(0, 0, 0), mask == 0);