Javacv斑点检测

3
我想在我的Java应用程序中使用一些blob检测,因此使用JavaCV而不是OpenCV。我找到了许多类,如:SimpleBlobDetectorCvBlobDetectorCvBlob等,但我找不到任何教程或示例代码来在Java中使用它们。请问有人能告诉我如何使用它们吗?因为我无法弄清楚,并且没有好的文档资料。谢谢!

1
JavaCV API尽可能地映射C/C++ API。如果您能找到一些用C/C++编写的文档或示例,将其翻译成Java应该不会太难... - Samuel Audet
2个回答

8
我正在解决同样的问题,并已经有了第一个解决方案。虽然有很多方法可用,但不幸的是大部分都很丑陋且缓慢。到目前为止,我的主要目标是留在JavaCV/OpenCV世界中。
以下链接将我引向正确的方向:
  1. OpenCV中的Blob提取
  2. 使用OpenCV进行连通组件分析
  3. OpenCV中的轮廓发现
这是一个完整的演示类,应该可以向您展示如何完成它。对于最佳结果,请使用具有简单对象和尖锐角的黑色背景图像进行测试。确保查看上面的第二个链接以了解代码中发生的情况。
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://dev59.com/_G445IYBdhLWcg3w6eNo
 * @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);
    }

}

请在此处提供您使用的示例图像。谢谢。 - SL_User
@SL_User:请使用上面第二个链接中提供的图片。 - happyburnout

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

是的... 'box' 应该替换为 'boundbox'。你所说的不完整是什么意思?这个方法是完整的,而且对我来说它是有效的。请评论哪一部分会出错。 - Keshan De Silva
cvRectangle(resultImage,cvPoint(box.x(),box.y()),cvPoint(box.x()+ box.width(),box.y()+ box.height())), <- 这行甚至还没有完成 - Tanner
抱歉,当我从项目中复制代码时,我错过了那部分内容。 - Keshan De Silva
cvRectangle(resultImage,cvPoint(box.x(),box.y()),cvPoint(box.x()+ box.width(),box.y()+ box.height()),cvScalar(0,255,255,0),3,0,0); - Keshan De Silva
1
这是我毕业研究项目的一个代码片段。它运行良好。如果您对此代码有任何问题,请告诉我。谢谢。 - Keshan De Silva
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接