使用OpenCV从UIImage检测Image对象

时间:2016-09-07 06:41:38

标签: ios objective-c opencv image-processing object-detection

我对OpenCV来说是全新的,但在谷歌搜索期间,我开始了解对象检测&边缘检测。但是,仍然无法找到从ScreenShot检测图像的正确方法。

例如,如果我像下面一样传递带有照片的图像,那么我需要从源图像中提取该照片。

enter image description here

修改 按照@Amitay Nachmani的回答后,我尝试将以下代码实施到第4步。

-(UIImage*)processImage:(UIImage*)sourceImage{

    cv::Mat processMat;
    UIImageToMat(sourceImage, processMat);

    cv::Mat grayImage;
    cvtColor(processMat, grayImage, CV_BGR2GRAY);

    cv::Mat cannyImage;
    cv::Canny(grayImage, cannyImage, 0, 50);


    cv::Vec2f lines2;
    std::vector<cv::Vec2f> lines;
    cv::HoughLines(cannyImage, lines, 1, CV_PI/180, 300);

    size_t sizeOfLine = lines.size();
    for(size_t i=0;i<sizeOfLine;i++){
        float rho = lines[i][0], theta = lines[i][1];

        if(rho==0){
            cv::Point pt1,pt2;
            double a = cos(theta), b = sin(theta);
            double x0 = a*rho, y0 = b*rho;
            pt1.x = cvRound(x0 + 1000*(-b));
            pt1.y = cvRound(y0 + 1000*(a));
            pt2.x = cvRound(x0 - 1000*(-b));
            pt2.y = cvRound(y0 - 1000*(a));

            cv::line(cannyImage, pt1, pt2, cv::Scalar(255,0,0),2.0);
        }
    }

    UIImage *result = MatToUIImage(cannyImage);
    return result;
}

从上面的代码中,我生成了以下Image。 enter image description here

编辑2 我通过替换条件修改了代码 if(rho==0)if(theta==0)

。{

这导致下面的图像 enter image description here

但是,还有下一步做什么?我对下一步有点困惑。

3 个答案:

答案 0 :(得分:2)

我不完全确定,但是你尝试过模板匹配技术吗? 如果您使用c ++编写opencv代码: http://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

我希望这有助于找到模板(源图像)和测试图像(屏幕截图)之间的互相关。

在下面的链接中,您将找到有关如何应用和绘制模板匹配的完整示例。

希望这会有所帮助。

干杯。

垂发。

答案 1 :(得分:2)

如果您知道图像始终位于第二条水平线和第三条水平线之间,则会执行以下操作:

  1. 转换为灰度(opencv cvtColor)
  2. 运行Canny边缘检测(opecv Canny())
  3. 使用Hough线查找线条(opencv HoughLines()http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghlines/py_houghlines.html
  4. 只取4条最突出的水平线(取水平线,你需要theta = 90)
  5. 根据y坐标
  6. 对找到的行进行排序
  7. 在第二行和第三行之间裁剪图像

答案 2 :(得分:2)

我完全同意下面的帖子,这是最好的解决方案,但遗憾的是,我认为@Mrug开发将针对智能手机设备,并且精确边缘检测和hough line变换在这些平台上的计算成本非常高。

可能您可以使用旨在计算水平和垂直衍生物的Sobel衍生物。

这些链接可以帮助您:

索贝尔衍生品 http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/sobel_derivatives/sobel_derivatives.html

Canny边缘探测器 http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

霍夫变换:

http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html