OpenCV和iOS,将图像提取/裁剪成匹配的部分

时间:2018-05-17 16:40:16

标签: c++ ios objective-c opencv tensorflow

我一直在努力寻找这个问题的解决方案,它可能比我想的更简单。

我目前正在构建一个需要使用TensorFlow分析图像的应用。那部分我已经能够起床并且没有问题(想想“不是热狗”应用程序)。

我遇到的问题是我需要分析的图像将包含我所追求的几个单独的图像。

TLDR ;我能想到解释的最好方法是,我训练了一个模型来分析个体蛋。现在我拍一张鸡蛋盒的图片(有点对称,有序,但可能是不同的角度/照明等)。我如何从图片中提取单个鸡蛋进行单独分析?另一个关键部分是我需要它们(从上到下,或从下到上,通过最佳匹配,例如,使用OpenCV matchTemplate方法)

我很乐意分享代码,但到目前为止,一切都是研究,这是导致我进入OpenCV的原因,到目前为止我只是将其作为库依赖而添加。我看过模板匹配,洪水填充等等。我只是不能将它们全部绑在一起,以便能够将图像“剪切”成单个部分。

我希望这已经足够了,但请告诉我,我可以尝试添加更多细节。

作为参考,我已经阅读了这些例子:

https://samwize.com/2013/06/09/using-opencv-to-match-template-multiple-times/

https://www.toptal.com/machine-learning/real-time-object-detection-using-mser-in-ios ......以及其他许多人,这些似乎与我想要完成的事情最相关。

编辑作为一个例子,我发现这张图片与我将要使用的内容进行了很好的比较。鉴于乐高积木的这种形象,我将如何出口个别作品?我并不太关心额外的数据(即不需要完全裁剪,只需要分开各个部分)。 另一个关键的事情是我需要它们从上到下排序(在示例图像中蓝色块将是#1,红色#2等)

enter image description here

1 个答案:

答案 0 :(得分:1)

没有要测试的样本图像,我可以给你一个关于如何继续进行的理论方法。

您可以对原始图像使用OTSU二值化,并获得黑白图像,其中每个蛋都是黑色背景上的白色斑点。

(可选:运行一些形态学操作,如侵蚀,打开,ecc分开接触的蛋)

在此图片上,您可以使用cv::findContours提取每个鸡蛋的边框。

现在在每个边界上,你可以使用cv::minAreaRect找到每个蛋的边界框。

使用边界框区域的某些阈值过滤掉误报。

现在你有一个旋转的边界框数组,你可以用它来提取原始图像中的相同区域,并将它们作为输入提供给训练有素的网络(因为你使用张量流,你可以创建一批图像并将所有批次作为输入提供给您的网络,以并行运行评估)

这是python中的一个偏差(“image.png”是你的乐高积木图片):

import cv2
import numpy as np

def main():
    img = cv2.imread("image.png", 0)
    threshold, binary = cv2.threshold(img,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

    cv2.imshow("bin",binary)

    im2, contours, hierarchy = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    draw = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
    #cv2.drawContours(img, contours, 0, (255,0, 0), 2)

    boxes = []
    for contour in contours:
        #cv2.drawContours(img, [contour], 0, (0,255,0), 2)
        area = cv2.contourArea(contour)
        # heuristic: ignore small objects and noise
        if area < 50:
            continue
        box = cv2.boundingRect(contour)
        boxes.append(box)


    feed_to_tensorflow = []
    for box in boxes:
        #extract roi
        x, y, width, height = box
        roi = img[y:y+height, x:x+width]
        feed_to_tensorflow.append(roi)
        cv2.imshow("box", feed_to_tensorflow[-1])
        cv2.waitKey()


    cv2.imshow("img", img)
    cv2.waitKey()


if __name__ == "__main__":
    main()