Opencv 打开cv-处理-检测葡萄

Opencv 打开cv-处理-检测葡萄,opencv,processing,Opencv,Processing,我有一个opencv的问题,我必须用相机检测和跟踪葡萄使用程序:处理,怎么办?能给我举个例子吗?谢谢 此代码是检测人脸的示例代码: 导入gab.opencv.*; 导入处理。视频。*; 导入java.awt.*; 捕获视频; OpenCV-OpenCV; 无效设置{ 尺寸640480; 视频=新Capturatis,640/2480/2; opencv=newopencvthis,640/2480/2; opencv.loadcascade opencv.CASCADE_FRONTALFACE;

我有一个opencv的问题,我必须用相机检测和跟踪葡萄使用程序:处理,怎么办?能给我举个例子吗?谢谢

此代码是检测人脸的示例代码:

导入gab.opencv.*; 导入处理。视频。*; 导入java.awt.*; 捕获视频; OpenCV-OpenCV; 无效设置{ 尺寸640480; 视频=新Capturatis,640/2480/2; opencv=newopencvthis,640/2480/2; opencv.loadcascade opencv.CASCADE_FRONTALFACE; 视频启动; } 抽真空{ 鳞片2; opencv.loadImagevideo; 图像视频,0,0; 无填料; 冲程0,255,0; 冲程重量3; 矩形[]面=opencv.detect; 打印长度; 对于int i=0;i你用来检测人脸的代码

作为一个基本的细分,你需要从背景中分割你试图检测葡萄的对象。我建议从简单开始:

试着简单地使用,看看是否每个葡萄的亮点可以被隔离。如果相机没有直视光源,它们有望成为图像中最亮的点 如果方法1无效,尝试使用颜色检测:如果你想检测哪种葡萄,你可以选择一系列颜色来检测,而忽略其他颜色。运行示例,并对范围进行游戏。将弹珠图像与葡萄图像交换,看看能得到什么。 OpenCV有一个专门为检测圆而构建的函数:。不幸的是,Greg的OpenCV处理库并没有像他那样包装这个函数,但它提供了在OpenCV的Mat和处理PImage之间转换的函数。如果您刚刚开始处理,并且没有使用普通Java的经验,那么这可能会更加复杂。 首先尝试基本阈值和HSB范围阈值。一旦你有了一个好看的二值图像,背景是完全黑色的,葡萄是白色的,你就可以得到每个轮廓的质心,计算轮廓,等等

另一种选择可能是训练支持向量机来区分两类:grapes和notgrapes。这是一个更高级的主题,但幸运的是,OpenCV处理库的作者Greg Borenstein写了一篇很好的文章,其中包含了关于创建该主题的视频和示例代码。退房

下面是使用google图像结果的示例和示例的mashup:

以下是选择更接近葡萄颜色范围的预览:

你已经注意到这既容易使用,也不是完全证明,应该让你走上正确的轨道,问自己正确的问题。 例如:

您支持哪些环境?室内/室外、自然照明、人工照明、白天、夜间,两者都有?等等-灯光控制输入图像的外观,因此至关重要 你会支持多少种不同的葡萄?你能用单一的颜色范围吗?是否有可能引发假阳性的元素? 等
不是你的个人密码部队。到目前为止,您尝试了什么?我更新了PostInd发布的球的短剪辑?:这个程序直接捕获一个视频,它必须检测一些圆圈。我不会用它来检测图形。你是说葡萄吗?对不起,我不能检测形式。你能做代码吗?你试过用这个例子来交换大理石和葡萄的图像吗?你得到了什么输出?是的,它检测到了,但我不会也检测表单,你能做吗,我不明白它是怎么做的我不明白你所说的表单是什么意思。每个葡萄的轮廓?一簇葡萄的轮廓?你有没有办法想象一下,让别人更容易理解?萨缪尔的意思是一堆葡萄,许多小圆圈。我是萨缪尔的朋友。谢谢你有趣的反馈
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);
}