【问题标题】:Open cv - Processing - detect grapesOpencv - 处理 - 检测葡萄
【发布时间】:2017-06-23 07:33:16
【问题描述】:

我的opencv有问题,我必须使用程序用摄像头检测和跟踪葡萄:处理,怎么做?我可以举个例子吗?谢谢你

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

import gab.opencv.*;
import processing.video.*;
import java.awt.*;

Capture video;
OpenCV opencv;

void setup() {
  size(640, 480);
  video = new Capture(this, 640/2, 480/2);
  opencv = new OpenCV(this, 640/2, 480/2);
  opencv.loadCascade(OpenCV.CASCADE_FRONTALFACE);  

  video.start();
}

void draw() {
  scale(2);
  opencv.loadImage(video);

  image(video, 0, 0 );

  noFill();
  stroke(0, 255, 0);
  strokeWeight(3);
  Rectangle[] faces = opencv.detect();
  println(faces.length);

  for (int i = 0; i < faces.length; i++) {
    println(faces[i].x + "," + faces[i].y);
    rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height);
  }
}

void captureEvent(Capture c) {
  c.read();
}

【问题讨论】:

  • 不是你个人的编码大军。到目前为止,您尝试过什么?
  • 我更新帖子
  • 介意发布小球的短片吗? :)
  • 这个程序直接捕捉视频,它必须检测一些圆圈(我不会用它来检测抓地力)
  • 你是说葡萄吗?

标签: opencv processing


【解决方案1】:

您用来检测人脸的代码。

作为基本细分,您需要从背景中分割您尝试检测的对象(在本例中为葡萄)。我建议从简单开始:

  1. 尝试简单地使用threshold(),看看是否可以分离出每个葡萄的亮点。希望它们会成为图像中最亮的地方(如果相机没有直视光源)
  2. 如果方法 1 无效,请尝试使用颜色检测:如果您想检测哪种葡萄,您可以选择一个颜色范围来检测,而忽略其余的。运行HSVColorTracking 示例并使用范围。将大理石图像与葡萄图像交换,看看你能得到什么。
  3. OpenCV 有一个专门用于检测圆圈的函数:HoughCircles。不幸的是,Greg 的 OpenCV 处理库并没有像他对 HoughLines 那样包装这个函数,但它提供了在 OpenCV 的 Mat 和处理 PImage 之间转换的函数。如果您刚刚开始使用 Processing 并且没有使用纯 Java 的经验,那么这可能会更加复杂。

首先尝试基本阈值和 HSB 范围阈值。一旦你有一个好看的二值图像(背景是全黑的,葡萄是白色的)你可以findContours,得到每个轮廓的质心,计算minEnclosingCircle(),等等。

另一种选择可能是训练支持向量机来区分两个类别:葡萄和非葡萄。这是一个更高级的主题,但幸运的是,OpenCV 处理库的作者 Greg Borenstein 写了一篇不错的文章,其中包含有关创建该主题的视频和示例代码。查看PSVM: Support Vector Machines for Processing

以下是使用 google 图像结果的 HueRangeSelectionFindContours 示例的混搭:

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);
}

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

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

  • 您支持哪些环境? (室内/室外、自然采光、人工照明、白天、夜间,两者都有?等等)- 灯光控制着您输入图像的外观,因此至关重要
  • 您将支持多少种不同的葡萄? (你能摆脱单一类型(颜色范围),是否有可能触发误报的元素?)

【讨论】:

  • 对不起,我无法检测到表单,请问您可以输入代码吗?
  • 您是否尝试过使用HSVColorTracking 示例将大理石的图像与葡萄交换?你得到了什么输出?
  • 是的,它会检测到,但我不会检测到表单,你能做吗,我不明白怎么做
  • 我不明白你说的表格是什么意思。每个葡萄的轮廓?一串葡萄的轮廓?有什么方法可以将其可视化,以便其他人更容易理解?
  • Samuele 的意思是一串葡萄,很多小圆圈。我是塞缪尔的朋友。感谢您的有趣反馈
猜你喜欢
  • 2014-12-19
  • 2014-12-06
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多