OpenCV轮廓没有关闭

时间:2018-05-02 11:01:15

标签: android image opencv image-processing opencv-contour

大家好日子!

我在创建轮廓方面遇到了问题。我尝试了所有的配置,不幸的是,我不可能得到一个对象的大轮廓。 第一个文件被加载到位图中,最后将位图加载到文件中。 (此处未显示,因为它什么都没有)。

之前的图片:

img1

之后的图片:

img2

我想要的效果只是整车的外轮廓或至少是它的一些近似值。我目前拥有的代码(在到处查看之后)是:

bitmap = ThumbnailUtils.extractThumbnail(BitmapFactory.decodeFile(filePath), 500, 500);
    Mat src = new Mat();
    Utils.bitmapToMat(bitmap, src);
    Mat gray = new Mat();
    Imgproc.cvtColor(src, gray, Imgproc.COLOR_RGBA2GRAY);
    Imgproc.Canny(gray, gray, 0, 1000);
    List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
    Mat hierarchy = new Mat();
    Imgproc.findContours(gray, contours, hierarchy, Imgproc.CV_RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
    for (int contourIdx = 0; contourIdx < contours.size(); contourIdx++) {
        Imgproc.drawContours(src, contours, contourIdx, new Scalar(0, 0, 255), -1);
    }
    Utils.matToBitmap(gray, bitmap);

1 个答案:

答案 0 :(得分:0)

每当图像中有一堆复杂的颜色时,在尝试分割感兴趣的对象之前,始终将其转换为另一个颜色空间。

在提供的示例中,我将图像转换为各种颜色空间,如HSV,LAB和YCrCb(谷歌搜索更多信息)。 HSV图像中的色调通道被证明是突出的分割。

这是我的结果:

enter image description here

伪代码:

  1. 获得色调通道图像的阈值图像
  2. 在色调通道的倒像上进行扩张。
  3. 找到具有最大区域覆盖范围的轮廓并将其标记为
  4. 修改

    以下是代码:

    import cv2
    
    path = 'C:/Users/Desktop/'
    img = cv2.imread(path + 'car.jpg')
    img = cv2.resize(img, (0,0), fx=0.25, fy=0.25)  #-- image was too big hence I had to resize it
    
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)      #-- HSV conversion
    h, s, v = cv2.split(hsv)
    
    cv2.imshow('hsv Image', hsv)
    cv2.imshow('h Image', h)
    cv2.imshow('s Image', s)
    cv2.imshow('v Image', v)
    

    我也尝试使用LAB和YCrCb色彩空间,但HSV的色调通道看起来更好,因此我坚持使用它。

    ret, thresh = cv2.threshold(s, 87, 255, cv2.THRESH_BINARY)  #-- I had to check which threshold would be the optimum one to best separate the car
    cv2.imshow('hue_thresh', thresh)
    
    
    kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
    dilation = cv2.dilate(cv2.bitwise_not(thresh), kernel1, iterations = 4)   #-- performed dilation on the inverted image because the region of interest was not highlighted
    cv2.imshow('dilation', dilation)
    

    现在,在有了可能感兴趣的区域之后,我假设有最大面积的轮廓来容纳汽车。

    _, contours, hierarchy =    cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    big_contour = 0    #-- contour with maximum area is stored here
    max_area = 0       #-- to store maximum area
    
    for cnt in contours:
        if (cv2.contourArea(cnt) > max_area):  #-- condition check to find contour with max area
            max_area = cv2.contourArea(cnt)
            big_contour = cnt
    
    x, y, w, h = cv2.boundingRect(big_cnt)     #-- store coordinates of contour with max area
    cv2.rectangle(img, (x,y), (x+w,y+h), (0, 255, 0), 2)
    cv2.imshow('rect_img', img)
    
    cv2.imwrite(path + 'rect_img.jpg', img)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()