我有一个通过CRON每分钟启动一个jar来捕获海滩网络摄像头图像并将其保存到文件中。由于它运行24 * 7,因此可以节省无用的夜间图像。我想要jar来分析文件并确定它是否是“守护者”。
我能看到的唯一方法(我还没编码)是遍历每个像素,查看每个像素的RGB,如果某些像素的百分比是完全或接近黑色,则将其称为一次性。这是一种合理的方法吗?
FWIW,图像来自安装在克利尔沃特海滩希尔顿酒店顶部的摄像机,俯瞰西南海滩和60号码头 - 地球上的天堂,这个爱荷华州的男孩。
URL = HTTP \://192.163.243.248/webcams/clearwater.jpg
谢谢, 克里斯
答案 0 :(得分:1)
假设您没有使用图像处理库(我不知道任何免费的开源库,但您可以查看this thread),更合理的方法是选择行的子集。例如,检查每20行。如果图像的高度为640,则只需要查看32行。您只能检查每个第2或第4行或每行上的任何像素。基本原理是像素到像素,甚至是线到线,像素值不会有太大差异......特别是在晚上。
使用某种时间范围,如同建议也有意义,但可能需要一些调整,因为日出和日落每天都在变化。
答案 1 :(得分:1)
我最终使用下面的例程来确定图像是否值得保留。它会查看每第10行的每10个像素,如果红色,绿色和蓝色分量的总和小于30(我从无处拉出的数字),则将像素调暗。如果10%(另一个任意数字)或更多像素是暗的,则图像是暗的。
private boolean keepImage(BufferedImage bufferedImage){
int imageHeight = bufferedImage.getHeight();
int imageWidth = bufferedImage.getWidth();
long pixelCount = 0;
long darkPixels = 0;
for(int y=0;y<imageHeight;y+=10){
for(int x=0;x<imageWidth;x+=10){
pixelCount++;
int rgb = bufferedImage.getRGB(x, y);
int red = (rgb >> 16) & 0x000000FF;
int green = (rgb >>8 ) & 0x000000FF;
int blue = (rgb) & 0x000000FF;
if (red + green + blue < 30)
darkPixels++;
}
}
float darkQuotient = (float)darkPixels/(float)pixelCount;
return darkQuotient<0.1;
}