投影法主要思想就是记录每一行或者每一列对应想要的像素的个数,然后根据这些个数判断它是不是边界或者是想要的物体。其中像素的个数就像是一个阈值,最后可以把每一行点的个数画出来便于直观的观察。
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
//竖直投影
vector<Mat> verticalProject(Mat srcimg)
{
int width_src = srcimg.cols;
int height_src = srcimg.rows;
vector<int> vector_num;
for (int i = 0; i < width_src; i++)
{
int white_num = 0;
for (int j = 0; j < height_src; j++)
{
int prePixel = srcimg.at<uchar>(j, i);
if (prePixel == 255)
white_num++;
}
vector_num.push_back(white_num);
}
//打印数组里面的内容
cout << "Number" << vector_num.size() << endl;
cout << "Cols" << width_src << endl;
cout << "Rows" << height_src << endl;
/*for (int i = 0; i < vector_num.size(); i++)
{
cout << vector_num[i] << endl;
}*/
//画出竖直投影直方图
Mat draw_img(height_src,width_src, CV_8UC1,Scalar(0));
for (size_t i = 0; i <width_src; i++)
{
line(draw_img, Point(i,height_src), Point(i,height_src-vector_num[i]), Scalar(255), 1, 8);
}
imshow("Draw_img", draw_img);
//对图像进行切割
bool num_yesorno = false;
int start_index = 0;
int end_index = 0;
vector<Mat> roi_img;
for (size_t i = 0; i < width_src; i++)
{
if (!num_yesorno&&vector_num[i] != 0)
{
num_yesorno = true;
start_index = i;
}
else if (num_yesorno&&vector_num[i] == 0)
{
num_yesorno = false;
end_index = i;
Mat roi = srcimg(Range(0, height_src), Range(start_index, end_index));
roi_img.push_back(roi);
}
}
cout << "Roi size" << roi_img.size() << endl;
return roi_img;
}
int main(int argc, char **argv)
{
Mat src = imread("E:/picture/shuzifenge.png");
if (src.empty())
{
cout << "Can not find the image..." << endl;
system("pause");
}
imshow("Input image", src);
Mat gray_img, bin_img;
cvtColor(src, gray_img, COLOR_BGR2GRAY);
threshold(gray_img, bin_img, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
imshow("Bin img", bin_img);
//读取返回值
vector<Mat> roi_Final =verticalProject(bin_img);
//循环显示每一个图
for (int i = 0; i < roi_Final.size(); i++)
{
string k =to_string(i);
imshow(k,roi_Final[i]);
}
waitKey(0);
return 0;
}
参考:
https://blog.csdn.net/wx7788250/article/details/60139109
https://blog.csdn.net/lcalqf/article/details/71191979