如何在OpenCV Java中使用不是Rectangle形状的轮廓裁剪图像?

时间:2017-08-15 09:32:42

标签: java image opencv

我刚刚在2周前学习OpenCV并计划在我的Spring项目中使用java包装器。我希望根据其形状裁剪图像并将其嵌入纯白色背景中。我已经尝试过几种来自互联网的方法(HSV平均比较,使用标准ROI进行裁剪,屏蔽等)并决定使用我从一些论坛得到的这些步骤:

  1. 将img转换为灰度
  2. 将其阈值设为二进制图像
  3. 使用findContours获取实际大纲
  4. 根据轮廓结果裁剪图像
  5. 我希望有人可以帮我解决这个问题,或者指导使用其他方法,非常感谢。

    示例图像源: Image Source

    当前使用Rectangle ROI提取的结果(以下部分中未包含代码,因为我正在尝试更改方法):Cropped Image

    这是我尝试过的(使用OpenCV 3.2.0):

    System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
    // Reading the Image from the file and storing it in to a Matrix object
    String file ="C:/EXAMPLES/OpenCV/smartphone.jpg";
    Mat src = Imgcodecs.imread(file); 
    
    Mat srcClone = new Mat(); // clone it so it won't affect the original image
    Imgproc.cvtColor(src, srcClone, Imgproc.COLOR_BGR2GRAY); // convert the color to gray
    
    Double threshold =  Imgproc.threshold(srcClone, srcClone, 50, 255, Imgproc.THRESH_BINARY);
    
    // add gaussian blur effect to reduce noises
    Imgproc.GaussianBlur(srcClone, srcClone, new Size(5,5), 0);
    
    //find the edges using Canny
    Mat edges = new Mat();
    Imgproc.Canny(srcClone, edges, 100, 200);
    
    //find the Contour based on Canny result
    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    final Mat hierarchy = new Mat();
    Imgproc.findContours(edges, contours, hierarchy, Imgproc.RETR_EXTERNAL , Imgproc.CHAIN_APPROX_SIMPLE);
    
    //don't know the next step if not using Rectangle ROI
    ...
    

0 个答案:

没有答案