2012-02-03 62 views
3

我想在我的應用程序中使用一些blob檢測,這是用Java編寫的,因此使用JavaCV而不是OpenCV。我發現很多類,如:Javacv Blob檢測

SimpleBlobDetectorCvBlobDetectorCvBlob,......但我無法找到任何教程或演示/示例代碼在Java中使用這些。 任何人都可以請告訴我如何使用這些,因爲我無法弄清楚,沒有好的文檔。 謝謝!

+1

的JavaCV API儘可能緊密映射儘可能C/C++ API。如果您可以找到一些用C/C++編寫的文檔或示例,那麼將其翻譯爲Java應該不會太難...... – 2012-03-12 11:08:34

回答

6

我只是在這個時刻工作在同一個問題上,並有第一個解決方案。 有很多方法,但不幸的是,其中大多數是醜陋和緩慢。 我的主要目標是留在JavaCV/OpenCV-World中。

這些鏈接把我推在正確的方向:

  1. Blob extraction in OpenCV
  2. http://voices.yahoo.com/connected-components-using-opencv-5462975.html?cat=15
  3. ​​

這裏是一個要告訴你它是如何做一個完整的Demo類。 嘗試使用帶簡單物體和尖角的黑色背景圖像以獲得最佳效果。請務必檢查上面的第二個鏈接,以獲取有關代碼中發生的事情的信息。

import static com.googlecode.javacpp.Loader.sizeof; 
import static com.googlecode.javacv.cpp.opencv_core.CV_FILLED; 
import static com.googlecode.javacv.cpp.opencv_core.CV_RGB; 
import static com.googlecode.javacv.cpp.opencv_core.IPL_DEPTH_8U; 
import static com.googlecode.javacv.cpp.opencv_core.cvCreateImage; 
import static com.googlecode.javacv.cpp.opencv_core.cvCreateMemStorage; 
import static com.googlecode.javacv.cpp.opencv_core.cvDrawContours; 
import static com.googlecode.javacv.cpp.opencv_core.cvGetSize; 
import static com.googlecode.javacv.cpp.opencv_core.cvPoint; 
import static com.googlecode.javacv.cpp.opencv_highgui.cvLoadImage; 
import static com.googlecode.javacv.cpp.opencv_highgui.cvSaveImage; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_BGR2GRAY; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_CHAIN_APPROX_SIMPLE; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_RETR_CCOMP; 
import static com.googlecode.javacv.cpp.opencv_imgproc.CV_THRESH_BINARY; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvCvtColor; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvFindContours; 
import static com.googlecode.javacv.cpp.opencv_imgproc.cvThreshold; 

import java.awt.Color; 
import java.util.Random; 

import com.googlecode.javacv.cpp.opencv_core.CvContour; 
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage; 
import com.googlecode.javacv.cpp.opencv_core.CvScalar; 
import com.googlecode.javacv.cpp.opencv_core.CvSeq; 
import com.googlecode.javacv.cpp.opencv_core.IplImage; 

/** 
* A demo for blob extraction using only JavaCV/OpenCV 
* @see https://stackoverflow.com/questions/4641817/blob-extraction-in-opencv 
* @see http://voices.yahoo.com/connected-components-using-opencv-5462975.html?cat=15 
* @see http://opencv.willowgarage.com/documentation/cpp/structural_analysis_and_shape_descriptors.html#cv-findcontours 
* @author happyburnout 
*/ 

public class JavaCVBlobDemo { 

    static String sourcePath = "c:/test/source.jpg"; 
    static String targetPath = "c:/test/target.jpg"; 

    public static void main (String args[]){ 
     IplImage image = cvLoadImage(sourcePath); 
     IplImage grayImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1); 
     cvCvtColor(image, grayImage, CV_BGR2GRAY); 

     CvMemStorage mem; 
     CvSeq contours = new CvSeq(); 
     CvSeq ptr = new CvSeq(); 
     cvThreshold(grayImage, grayImage, 150, 255, CV_THRESH_BINARY); 
     mem = cvCreateMemStorage(0); 

     cvFindContours(grayImage, mem, contours, sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 

     Random rand = new Random(); 
     for (ptr = contours; ptr != null; ptr = ptr.h_next()) { 
      Color randomColor = new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat()); 
      CvScalar color = CV_RGB(randomColor.getRed(), randomColor.getGreen(), randomColor.getBlue()); 
      cvDrawContours(image, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0)); 
     } 
     cvSaveImage(targetPath, image); 
    } 

} 
+0

請提供您在此處使用的示例圖像。謝謝 – 2012-06-19 05:51:17

+0

@SL_User:請使用上面第二個鏈接中提供的圖片 – happyburnout 2013-09-20 12:28:57

-2
public static IplImage detectObjects(IplImage srcImage){ 

    IplImage resultImage = cvCloneImage(srcImage); 

    CvMemStorage mem = CvMemStorage.create(); 
    CvSeq contours = new CvSeq(); 
    CvSeq ptr = new CvSeq(); 

    cvFindContours(srcImage, mem, contours, Loader.sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 

    CvRect boundbox; 

    for (ptr = contours; ptr != null; ptr = ptr.h_next()) { 
     boundbox = cvBoundingRect(ptr, 0); 

     cvRectangle(resultImage, cvPoint(boundbox.x(), boundbox.y()), cvPoint(boundbox.x() + boundbox.width(), boundbox.y() + boundbox.height()),cvScalar(0, 255, 255, 0), 3, 0, 0); 
    } 

    return resultImage; 
} 
+0

僅供參考:您的代碼不完整,無法編譯。 – Tanner 2012-05-28 18:31:06

+0

yep ...'box'應該替換爲'boundbox'。你不完整的意思。這種方法是完整的,它爲我工作。請評論哪些部分會出錯。 – 2012-05-29 02:57:17

+0

cvRectangle(resultImage,cvPoint(box.x(),box.y()), cvPoint(box.x()+ box.width(),box.y()+ box.height()),< - 這條線甚至沒有完成 – Tanner 2012-05-29 17:14:28