基于opencv的珠盘个数检测(c++)

本文介绍了一种基于OpenCV的珠盘个数检测算法,使用C++实现。通过灰度转换、形态学梯度、二值化及多次形态学处理,算法能够准确检测并标记出珠盘上的珠子数量及其缺失情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于opencv的珠盘个数检测(c++)

目标:检测该图片上的个数与缺几个并标出来

在这里插入图片描述
效果图:
在这里插入图片描述
算法原理:
先加载原图然后进行转灰度,进行形态学梯度处理,接着二值化,在进行2次形态学处理,提取轮廓(计算面积->寻找最小包围矩形)然后在进行角度纠正,再映射到X,Y寻找缺点

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

void Y_projection(Mat &warp, Mat &src, int max_gap, int &first, int &end);

int main(int argc, char** argv) {

	Mat src = imread("E:/opencv/yuandian.jpg");
	imshow("src", src);

	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	//获取自定义核
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));

	//形态学梯度(膨胀与腐蚀之差,保留物体的边缘)
	Mat dst;
	morphologyEx(gray, dst, MORPH_GRADIENT, element);
	//imshow("xingtaixuetidu", dst);
	
	//二值化
	Mat binary;
	threshold(dst, binary, 0, 255, THRESH_OTSU | THRESH_BINARY);
	imshow("binary", binary);

	//形态学处理
	Mat element_1 = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));
	//开运算(先腐蚀在膨胀,消除小物体,在细点分离物体)
	morphologyEx(binary, binary, MORPH_OPEN, element_1);
	imshow("MORPH_OPEN", binary);
	
	//闭运算(先膨胀在腐蚀,排除小型黑洞连接断点)
	Mat elemetn_2 = getStructuringElement(MORPH_ELLIPSE, Size(10, 10));
	morphologyEx(binary, binary, MORPH_CLOSE, elemetn_2);
	imshow("MORPH_CLOSE", binary);

	//提取轮廓
	vector < vector<Point >> contours;
	findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
	
	//创建一个和原图像大小的Mat
	Mat result = Mat::zeros(binary.size(), binary.type());
	int total = 0;
	for (size_t i = 0; i < contours.size(); i++) {
		double area = contourArea(contours[i]);
		if (area < 55) {
			continue;
		}
		//寻找最小包围矩形
		RotatedRect rrt = minAreaRect(contours[i]);
		Point2f vertex[4];
		rrt.points(vertex);
		circle(result, rrt.center, 5, (255), -1);
		total += 1;
	}
	imshow("result", result);

Mat warp;
	Mat rotMat = getRotationMatrix2D(Point2f((result.rows - 1) / 2, (result.cols - 1) / 2), 177,-1);
	warpAffine(result, warp, rotMat, result.size());
	warpAffine(src, src, rotMat, src.size());
	imshow("warp", warp);
	imshow("src warp", src);


	/////////
	
	vector<int> bins;
	for (int i = 0; i < warp.rows; i++) {
		int found = 0;
		for (int j = 0; j < warp.cols; j++) {

			if (warp.at<uchar>(i, j) == 255) {
				
				found += 1;
			}
		}
		if (found > 0) {
			bins.push_back(i);
		}
	}
	


	/////////
	vector<int> tbins;
	for (int i = 0; i < (bins.size()-1); i++) {
		
		int gap = bins[i + 1] - bins[i];
		if (gap >= 15) {
			tbins.push_back(bins[i + 1] - (gap/2));
		}	
	}

	int h = warp.rows - 1;

	for (int i = 0; i < tbins.size(); i++) {
		if (i == 0) {
			Y_projection(warp, src, 50, i, tbins[i]);
		}
		else if(i==(tbins.size()-1)){
			Y_projection(warp, src, 50, tbins[i],h);
		}
		else
		{
			int end = tbins[i] - 1;
			Y_projection(warp, src, 50, tbins[i-1], end);
		}
	}
	String number = "number:" + to_string(total);
	putText(src, number,Size(50,50),FONT_HERSHEY_SIMPLEX,1.0,Scalar(0,0,255),2);
	imshow("fianl_src", src);

waitKey(0);
	return 0;
}

void Y_projection(Mat &warp,Mat &src,int max_gap,int &first,int &end) {

	vector<int> y_bins;
	for (int i = 0; i < warp.cols; i++) {
		int found_y = 0;
		for (int j = first; j < end; j++) {

			if (warp.at<uchar>(j, i) == 255) {
			
				found_y += 1;
			}
		}
		if (found_y > 0) {
			y_bins.push_back(i);
		}
	}

	vector<int> y_tbins;
	for (int i = 0; i < y_bins.size()-1; i++) {
		
			int gap = y_bins[i + 1] - y_bins[i];
			if (gap >= 7) {
				y_tbins.push_back(y_bins[i + 1] - (gap/2));
			}
			if (gap >= 50) {
				circle(src, Point(y_bins[i + 1] - (gap / 2),(end-(end-first)/2)), 5, Scalar(0,0,255), -1);
			}
		
		
	}

}

OpenCV(Open Source Computer Vision Library)是一款开源的计算机视觉库,专门为图像和视频处理任务设计,广泛应用于学术研究、工业应用以及个人项目中。以下是关于OpenCV的详细介绍: 历史与发展 起源:OpenCV于1999年由英特尔公司发起,旨在促进计算机视觉技术的普及和商业化应用。该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由非盈利组织OpenCV.org维护,并得到了全球开发者、研究机构以及企业的持续贡献和支持。 主要特点 跨平台:OpenCV支持多种操作系统,包括但不限于Windows、Linux、macOS、Android和iOS,确保代码能够在不同平台上无缝运行。 丰富的功能:库中包含了数千个优化过的函数,涵盖了计算机视觉领域的诸多方面,如图像处理(滤波、形态学操作、色彩空间转换等)、特征检测与描述(如SIFT、SURF、ORB等)、物体识别检测(如Haar级联分类器、HOG、DNN等)、视频分析、相机校正、立体视觉、机器学习(SVM、KNN、决策树等)、深度学习(基于TensorFlow、PyTorch后端的模型加载与部署)等。 高效性能:OpenCV代码经过高度优化,能够利用多核CPU、GPU以及特定硬件加速(如Intel IPP、OpenCL等),实现高速图像处理和实时计算机视觉应用。 多语言支持:尽管OpenCV主要使用C++编写,但它提供了丰富的API绑定,支持包括C、Python、Java、MATLAB、JavaScript等多种编程语言,方便不同领域的开发者使用。 开源与免费:OpenCV遵循BSD开源许可证发布,用户可以免费下载、使用、修改和分发库及其源代码,无需担心版权问题。 架构与核心模块 OpenCV的架构围绕核心模块构建,这些模块提供了不同层次的功能: Core:包含基本的数据结构(如cv::Mat用于图像存储和操作)、基本的图像和矩阵操作、数学函数、文件I/O等底层功能。 ImgProc:提供图像预处理、滤波、几何变换、形态学操作、直方图计算、轮廓发现与分析等图像处理功能。 HighGui:提供图形用户界面(GUI)支持,如图像和视频的显示、用户交互(如鼠标事件处理)以及简单的窗口管理。 VideoIO:负责视频的读写操作,支持多种视频格式和捕获设备。 Objdetect:包含预训练的对象检测模型(如Haar级联分类器用于人脸检测)。 Features2D:提供特征点检测(如SIFT、ORB)与描述符计算、特征匹配与对应关系估计等功能。 Calib3d:用于相机标定、立体视觉、多视图几何等问题。 ML:包含传统机器学习算法,如支持向量机(SVM)、K近邻(KNN)、决策树等。 DNN:深度神经网络模块,支持导入和运行预训练的深度学习模型,如卷积神经网络(CNN)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值