您好,这个图片计数可以实现吗?有什么难点,大致什么思路,可以说一下嘛?
opencv计数项目实现代码
#include<iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
//加载图像
Mat src = imread("4.jpg");
if (src.empty())
{
cout << "no image!" << endl;
return -1;
}
imshow("src", src);
//二值化
Mat gray, binary;
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow("gray", gray);
threshold(gray, binary, 0, 255, THRESH_TRIANGLE);
imshow("binary", binary);
//图像形态学操作
Mat kern1 = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1,-1));
morphologyEx(binary, binary, MORPH_DILATE, kern1,Point(-1,-1),3);
imshow("dilate", binary);
//距离变换
Mat dist;
bitwise_not(binary, binary);//将白色背景变黑
imshow("not", binary);
distanceTransform(binary, dist, DIST_L2, 3);
normalize(dist, dist, 0.0, 1.0, NORM_MINMAX);
dist.convertTo(dist, CV_8UC1);
imshow("dist", dist);
//阈值分割
Mat img;
//threshold(dist, img, 0, 255, THRESH_BINARY | THRESH_OTSU);
adaptiveThreshold(dist, img, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 85, 0.0);
imshow("img", img);
//腐蚀操作
morphologyEx(img, img, MORPH_DILATE, kern1, Point(-1,-1),1);
imshow("dilate-img", img);
//寻找连通域
vector<vector<Point>>contours;
findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
Mat mask = Mat::zeros(src.size(), CV_8UC3);
for (size_t i = 0; i < contours.size(); i++)
{
drawContours(mask, contours, static_cast<int>(i), Scalar(0, 0, 255), -1, 8);
}
cout << "个数:" << contours.size() << endl;
imshow("result", mask);
waitKey(0);
return 0;
}
这个和人眼识别是一样的,需要先确认检测物品然后计数,将已识别物品标记去掉,防止循环识别,将整张图过滤完后就可以输出计数了