您用来检测人脸的代码。
作为基本细分,您需要从背景中分割您尝试检测的对象(在本例中为葡萄)。我建议从简单开始:
- 尝试简单地使用threshold(),看看是否可以分离出每个葡萄的亮点。希望它们会成为图像中最亮的地方(如果相机没有直视光源)
- 如果方法 1 无效,请尝试使用颜色检测:如果您想检测哪种葡萄,您可以选择一个颜色范围来检测,而忽略其余的。运行HSVColorTracking 示例并使用范围。将大理石图像与葡萄图像交换,看看你能得到什么。
- OpenCV 有一个专门用于检测圆圈的函数:HoughCircles。不幸的是,Greg 的 OpenCV 处理库并没有像他对 HoughLines 那样包装这个函数,但它提供了在 OpenCV 的
Mat 和处理 PImage 之间转换的函数。如果您刚刚开始使用 Processing 并且没有使用纯 Java 的经验,那么这可能会更加复杂。
首先尝试基本阈值和 HSB 范围阈值。一旦你有一个好看的二值图像(背景是全黑的,葡萄是白色的)你可以findContours,得到每个轮廓的质心,计算minEnclosingCircle(),等等。
另一种选择可能是训练支持向量机来区分两个类别:葡萄和非葡萄。这是一个更高级的主题,但幸运的是,OpenCV 处理库的作者 Greg Borenstein 写了一篇不错的文章,其中包含有关创建该主题的视频和示例代码。查看PSVM: Support Vector Machines for Processing。
以下是使用 google 图像结果的 HueRangeSelection 和 FindContours 示例的混搭:
import gab.opencv.*;
PImage img;
OpenCV opencv;
Histogram histogram;
int lowerb = 50;
int upperb = 100;
ArrayList<Contour> contours;
ArrayList<Contour> polygons;
void setup() {
size(800,400);
img = loadImage("grape-harvest-inside.jpg");
opencv = new OpenCV(this, img);
opencv.useColor(HSB);
}
void draw() {
opencv.loadImage(img);
image(img, 0, 0);
opencv.setGray(opencv.getH().clone());
opencv.inRange(lowerb, upperb);
histogram = opencv.findHistogram(opencv.getH(), 255);
image(opencv.getOutput(), width/2, height/2, width/2,height/2);
noStroke(); fill(0);
histogram.draw(10, height - 230, 400, 200);
noFill(); stroke(0);
line(10, height-30, 410, height-30);
text("Hue", 10, height - (textAscent() + textDescent()));
float lb = map(lowerb, 0, 255, 0, 400);
float ub = map(upperb, 0, 255, 0, 400);
stroke(255, 0, 0); fill(255, 0, 0);
strokeWeight(2);
line(lb + 10, height-30, ub +10, height-30);
ellipse(lb+10, height-30, 3, 3 );
text(lowerb, lb-10, height-15);
ellipse(ub+10, height-30, 3, 3 );
text(upperb, ub+10, height-15);
contours = opencv.findContours();
for (Contour contour : contours) {
stroke(0, 255, 0);
noFill();
contour.draw();
}
}
void mouseMoved() {
if (keyPressed) {
upperb += mouseX - pmouseX;
}
else {
if (upperb < 255 || (mouseX - pmouseX) < 0) {
lowerb += mouseX - pmouseX;
}
if (lowerb > 0 || (mouseX - pmouseX) > 0) {
upperb += mouseX - pmouseX;
}
}
upperb = constrain(upperb, lowerb, 255);
lowerb = constrain(lowerb, 0, upperb-1);
}
这里是选择更接近葡萄颜色范围的预览:
您已经注意到这既易于使用,但也不是完全证明,应该让您走上正确的轨道,问自己正确的问题。
例如:
- 您支持哪些环境? (室内/室外、自然采光、人工照明、白天、夜间,两者都有?等等)- 灯光控制着您输入图像的外观,因此至关重要
- 您将支持多少种不同的葡萄? (你能摆脱单一类型(颜色范围),是否有可能触发误报的元素?)
- 等