2017-06-23 43 views
-4

我有一個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(); 
} 
+2

不是你個人的編碼軍隊。你試過什麼了? – Phil

+0

我更新了文章 – user218794

+0

介意張貼短球的夾子? :) –

回答

2

你用試圖偵測臉部的代碼。

作爲一個基本的細分,你需要從背景中分割你想要檢測的對象(在這種情況下是葡萄)。我推薦從簡單起步:

  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

下面是使用谷歌圖像結果的HueRangeSelectionFindContours例子混搭:

grape-harvest-inside.jpg

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

這裏的選擇範圍更靠近葡萄顏色的預覽:

HSB Colour Range Selection

你已經注意到這很容易使用,但也沒有充分的證據,應該讓你在正確的軌道上問自己正確的問題。 例如:

  • 您支持哪些環境? (室內/戶外,自然採光,人造照明,白天,夜間,兩者?) - 光線控制你的輸入圖像的外觀,因此至關重要
  • 你會支持多少種不同的葡萄? (你可以逃脫使用單一類型的(色彩範圍),是有可能觸發誤報元素?)
+0

對不起,我無法檢測到表單,你可以做代碼嗎? – user218794

+0

您是否嘗試過使用[HSVColorTracking](https://github.com/atduskgreg/opencv-processing/blob/master/examples/HSVColorTracking/HSVColorTracking.pde)示例交換葡萄的彈珠圖像?你得到了什麼輸出? –

+0

是的,它檢測到,但我不會檢測到的形式,你可以做,我不明白它是如何做 – user218794