你用試圖偵測臉部的代碼。
作爲一個基本的細分,你需要從背景中分割你想要檢測的對象(在這種情況下是葡萄)。我推薦從簡單起步:
- 嘗試簡單地使用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。
下面是使用谷歌圖像結果的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);
}
這裏的選擇範圍更靠近葡萄顏色的預覽:
你已經注意到這很容易使用,但也沒有充分的證據,應該讓你在正確的軌道上問自己正確的問題。 例如:
- 您支持哪些環境? (室內/戶外,自然採光,人造照明,白天,夜間,兩者?) - 光線控制你的輸入圖像的外觀,因此至關重要
- 你會支持多少種不同的葡萄? (你可以逃脫使用單一類型的(色彩範圍),是有可能觸發誤報元素?)
- 等
不是你個人的編碼軍隊。你試過什麼了? – Phil
我更新了文章 – user218794
介意張貼短球的夾子? :) –