基于OpenCV视觉库让机械手根据视觉判断物体有无和分类抓取的例程

项目实例,在一个无人封闭的隔绝场景中,根据视觉判断物件的有无,通过机械手

进行物件分类提取,并且返回状态结果;

实际的场景是有一个类似采血的固件支架盘,上面很多采血管,采血管帽颜色可能不同,

也有可能支架盘上只有空位,没有放置采血管,需要机器操作。

图像的大小,支架和物件的位置、大小等等都基本保存一致不会经常的变化。

开始的思路是通过判断空位上的圆来做排除,遇到了局限性,比如光照不好的情况下,空位

并非是正常的圆,可能是缺的圆,而且因为视角的缘故,根本没法判断是圆了,于是只好放弃;

后来就进行二值化后判断多个圆,如果有多个圆的那应该是有物件的,二值化后显然无法

根据颜色来判断不同的提取对象,也是不行的;

最后还是觉得通过颜色来判断比较合理,因为不仅仅要获取物件的有无,还要判断物件的分类,

而且物件的大概位置不能错,因为要知道对应的位置上是否有插物件。

设计思路:

使用 HSV颜色模型来做。

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间,

也称六角锥体模型(Hexcone Model)。

HSV颜色模型是指H、S、V三维颜色空间中的一个可见光子集,它包含某个颜色域的所有颜色。

每一种颜色都是由色相(Hue,简H),饱和度(Saturation,简S)和色明度(Value,简V)所表示的。

这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。

色调H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,取值范围为0°~360°。

若从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。

它们的补色是:黄色为60°,青色为180°,紫色为300°;

饱和度S:取值范围为0.0~1.0;

亮度V:取值范围为0.0(黑色)~1.0(白色)。

调试判断过程如下:

橘红色物件

黄色物件

相关代码如下

cpp 复制代码
void CMFCCVMDlg::OnBnClickedBtnOpen()
{
	char* window_name = "testCELL";
	//resizeWindow(window_name, 480, 320);

	BOOL isOpen = TRUE;		    //是否打开(否则为保存)
	CString defaultDir = "";	//默认打开的文件路径
	CString fileName = "";		//默认打开的文件名
	CString filter = "图像文件 (*.png; *.jpg; *.bmp)|*.png;*.jpg;*.bmp||";	//文件过虑的类型
	CFileDialog openFileDlg(isOpen, defaultDir, fileName, OFN_HIDEREADONLY | OFN_READONLY, filter, NULL);
	openFileDlg.GetOFN().lpstrInitialDir = "";
	INT_PTR result = openFileDlg.DoModal();
	CString filePath = "";
	if (result != IDOK) 
	{
		//filePath = openFileDlg.GetPathName();
		return;
	}
	filePath = openFileDlg.GetPathName();
	Mat imgOriginal = imread(filePath.GetBuffer());

	namedWindow("imgOriginal", 0);
	imshow("imgOriginal", imgOriginal);

	int iLowH = 0, iLowS = 0, iLowV = 0;
	int iHighH = 180, iHighS = 255, iHighV = 255;

	Mat imgHSV, imgThresholded;
	//vector<Mat> hsvSplit;
	cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV
	//split(imgHSV, hsvSplit);

	namedWindow(window_name, 0);
	// 创建跟踪条并将其附着到指定窗口。
	createTrackbar("iLowH:", window_name, &iLowH, 180); //no name cann't use this
	createTrackbar("iHighH:", window_name, &iHighH, 180);

	createTrackbar("iLowS:", window_name, &iLowS, 255);
	createTrackbar("iHighS:", window_name, &iHighS, 255);

	createTrackbar("iLowV:", window_name, &iLowV, 255);
	createTrackbar("iHighV:", window_name, &iHighV, 255);

	while (true)
	{
		// 检查数组元素是否位于其他两个数组的元素之间。
		inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);
		//src.copyTo(dst, detected_edges);
		imshow(window_name, imgThresholded);
		char key = (char)waitKey(30);
		if (key == 27)
			break;
	}
}

最后做下亮块大小判断即可获得是否有物件,和对应位置,以及是什么颜色的物件。

相关推荐
YOLO数据集集合1 小时前
无人机低空影像语义分割数据集 | 语义分割 遥感影像 无人机低空 地物分类 Potsdam Vaihingen LoveDA 9080期
人工智能·深度学习·yolo·目标检测·计算机视觉·语义分割·无人机数据集
硅谷秋水4 小时前
GE-Act 2.0:面向机器人操作的“世界-动作”模型预训练与扩展
机器学习·计算机视觉·语言模型·机器人
AI Blog7 小时前
YOLO数据集 | 第05期:无人机检测、电力巡检、阀门识别
深度学习·目标检测·计算机视觉·yolo数据集
Evand J13 小时前
【MATLAB例程|图像滤波降噪13】局部噪声方差自适应滤波(LNR)图像降噪与效果展示。附完整例程的下载链接
图像处理·计算机视觉·matlab·滤波·代码·降噪
星野云联AIoT技术洞察20 小时前
RK3588 边缘 AI 盒子适合什么工业视觉场景
计算机视觉·边缘计算·rk3588·语音识别·图像识别·边缘网关·边缘计算盒子
这张生成的图像能检测吗21 小时前
(论文速读)Cylinder3D:面向室外 LiDAR 分割的柱面划分与非对称 3D 卷积
计算机视觉·点云·3d视觉·三维感知
贾伟康1 天前
【HarmonyOS 7新能力|028】Core Vision Kit工程封装:把接入逻辑放进可维护的分层结构
计算机视觉·harmonyos·arkts·端侧ai·harmonyos 7
Zentceh1 天前
0.001Lux是什么概念
图像处理·人工智能·科技·计算机视觉·车载系统·无人机·智能硬件
这张生成的图像能检测吗1 天前
(论文速读)SphereFormer:用径向窗口解决 LiDAR 远距离稀疏点的信息断连
计算机视觉·点云·3d技术·三维感知
YOLO数据集集合1 天前
Anti-UAV 可见光与红外无人机检测数据集| 反无人机 可见光红外 多模态检测 小目标检测 Anti-UAV9076期
人工智能·目标检测·计算机视觉·目标跟踪·无人机识别·反无人机·灾害救援