如何确定一袋米中的米粒数量是偶数还是奇数?


好的,作为一个理工生,一般不整那么多花里胡哨的,想知道奇数还是偶数,那就得算算大米到底有多少颗。

高赞确实有类似的设备可以实现这种数大米的功能,但是毕竟这种设备不便宜,现在有工业版本的,那有没有家用版本的。

比如我抓了一小撮大米,然后撒在桌面上,为什么只有一小撮呢?

第一:浪费粮食是不好的

第二:抓太多了大米之间连在一块,得用更复杂的方法,我懒

而一个一个算太慢,能不能用手边的设备来算算到底有多少颗呢?比如我们用手机拍一张照片,像这样。

那么,老规矩,为了方便图像后续处理,我们直接处理成灰度图(其实我后面琢磨了一下,不如去抓 r 通道效果更好,凑合看吧不管了)

然后我们看看背景颜色的灰度值

还有大米的灰度值

直接根据颜色差值设定阈值二值化图像

可以看到,效果不太好,为啥,因为因为背景光照不均匀有些大米内部颜色和背景混色了,一些大米出现了中空的情况,也好办,弄个导数的二值滤波,再来一次,

好,舒服多了,之后就是简简单单判定联通的白色区域了,然后我们标定后,把计数文本弄回原始图像中,可以看到,程序大米数的非常好,一撮大米一共 61 个,灰常准确有效。

应该算是图像 CV 比较入门级的知识点,下次拿去折磨下学生好了.

实验型代码,工程慎用

#include "PainterEngine.h"
px_texture srcTexture;
px_texture dstTexture;

px_void MarkRegion(px_texture* ptexture, px_int x, px_int y,px_color detectcolor, px_color markcolor,px_int *counter)
{
	
	if (x < 0 || y < 0 || x >= ptexture->width || y >= ptexture->height)
	{
		return 0;
	}
	if (PX_SURFACECOLOR(ptexture,x,y)._argb.ucolor== detectcolor._argb.ucolor)
	{
		PX_SURFACECOLOR(ptexture,x,y)=markcolor;
		(*counter)++;
		MarkRegion(ptexture, x + 1, y, detectcolor, markcolor,counter);
		MarkRegion(ptexture, x - 1, y, detectcolor, markcolor,counter);
		MarkRegion(ptexture, x, y + 1, detectcolor, markcolor,counter);
		MarkRegion(ptexture, x, y - 1, detectcolor, markcolor,counter);
	}
}

px_int main()
{
	px_int x, y;
	px_int riceCount=0;
	px_char content[32];
	PainterEngine_Initialize(800, 800);
	PX_LoadTextureFromFile(mp_static, &srcTexture, "assets/sample.png");
	PX_TextureCopy(mp_static, &srcTexture, &dstTexture);
	PX_ImageFilter_dBinarization(&dstTexture,160,3);
	
	for ( y= 0; y < dstTexture.height; y++)
	{
		for ( x = 0; x < dstTexture.width; x++)
		{
			px_int counter=0;
			MarkRegion(&dstTexture, x, y, PX_COLOR(255, 255, 255, 255), PX_COLOR(255, 0, 0, 255),&counter);
			if (counter>100)
			{
				riceCount++;
				PX_sprintf1(content,sizeof(content), "rice %1", PX_STRINGFORMAT_INT(riceCount));
				PX_FontDrawText(&srcTexture, x, y,PX_ALIGN_LEFTBOTTOM,content,PX_COLOR_RED);
			}
		}

	}
	
	//sum rice
	PX_sprintf1(content, sizeof(content), "Rice Count:%1", PX_STRINGFORMAT_INT(riceCount));
	PainterEngine_DrawTexture(&srcTexture, 400, 400, PX_ALIGN_CENTER);
	PainterEngine_DrawText(0, 0, content, PX_ALIGN_LEFTTOP, PX_COLOR_RED);
	
	
}

如果你想问工程上怎么用,非机器学习方法我估计会拿个比较"标准"的大米图形做增强后作为算子去做卷积,当然上机器学习方法也是没问题的,不过对于数数这种事而言必要性不大。

世界上第一个养猫的人可能会是谁?(中国近代第一个养猫的人)
上一篇
为什么要用丝绸包裹火药?(277丝绸棉被包裹)
下一篇
本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

相关推荐

  • 苹果手机各个功能介绍,iphone必须关闭的十个功能

    1、关闭蓝牙。现在已经很少有人用蓝牙传输文件了,而且iPhone与安卓的蓝牙并不兼容,所以,可以在设置中,关闭蓝牙功能。2、关闭通知功能。关于APP推送,无非也就是一些更新提醒,关了也不会有什么影响,还能多省点电。3、关闭自动调节亮度功能。一般来说,可以将屏幕亮度在15%-30%之间,在强光环境中,在进行手动调整就可以了。4、禁止后台刷新。在设置—通用中,关闭后台自动刷新功能,也可以对省电起到一点...

  • 高德打车怎么设置途经地,高德如何添加途经路线

    1、点击高德地图APP界面底部的“导航”按钮,进入导航模式。2、点击右下角的“路线”,进入路线设定页面,根据要求输入起点、终点进行路线规划。3、点击“添加途经点”,弹出添加途经点页面,点击右上角,可以添加或者删除途经点,乘客可以手动输入要添加的途经点。4、当添加完途经点时,点击“确定”按钮,即可添加途经路线。此时地图会显示出这条路线上所有的途经点,以及当前途经点的地点信息。怎么设计高德地图设置要经...

  • 高中必修二物理知识点总结,高一物理必修2重点知识点归纳

    您好,1.运动学-位移、速度、加速度的概念及计算方法-相关运动的分析方法,如相对运动和抛体运动-牛顿运动定律及其应用2.力学-力的概念及种类,如重力、弹力、摩擦力等-牛顿第一、二、三定律及其应用-力的合成与分解-能量、功、动能定理、功率的概念及计算方法-动量、冲量定理及其应用3.热学-温度、热量、热能的概念及计量单位-热传递的方式及其特点,如传导、对流、辐射-热力学第一、二定律及其应用,如热机效率...

  • 「大氧化」事件的前世今生(邯郸大学613事件)

    原创: 房晨曦 石头科普工作室 2019.05.29在浩瀚的宇宙中,有无数天体在浮沉,亿万星球之中有一颗显得那么与众不同,那就是地球——目前人类发现的唯一一颗有生命存在的星球。与地球漫长的演化史相比,...

  • 胃酸为什么是盐酸而不是硝酸?

    谢 @gamemode 3 邀请,估计你是从我在镜像问题中的回答找过来的吧?胃酸为什么是盐酸而不是硫酸?这个问题很有趣,我尽可能回答一下吧。因为我是学医出身而非生命科学专业,所以可能有些观点和知识掌握...