【问题标题】:How to detect a subset image in a picture where the position of the picture may change如何检测图片中图片位置可能发生变化的子集图像
【发布时间】:2014-06-20 12:43:05
【问题描述】:

我的目标只是检测座位,无论图像位于何处。为了让事情变得更简单这是将在屏幕上显示的唯一图像,但图像的位置可能会改变。用户可以将其向右、向左、向上向下移动,并可能显示图像的一部分。

我阅读了this thread,它展示了如何“暴力破解”图像以检测图像的一个子集,但是当我尝试它时 - 我花了 100 多秒才检测到它(虽然我是不寻找实时)而且,我认为我的挑战更简单。

问:我的方法应该是什么?我从来没有尝试过任何图像处理并准备好走这条路(如果它适用于此)。

谢谢!

这是将显示在屏幕上的图像(可能只显示其中的一部分,假设用户将其一直向右移动,它只显示带座椅的后轮)

子集图像总是这样:

【问题讨论】:

  • 您的机器人是否可以访问屏幕内容,或者它是否使用摄像机捕获不完整的副本?如果是前者,则不需要任何花哨的“最小错误”匹配算法——只需对精确的像素相等进行蛮力比较。
  • 强调@j_random_hacker 所说的:这里所需的努力主要取决于图像的可预测性。如果图像完全相同,那么这个任务相当容易并且可以非常有效地解决。但是,如果这可能是指在不同光线条件下拍摄的照片,具有不同背景或在不同视角下拍摄的照片,那么这项任务可能会变得非常困难 - 甚至是不可能的。甚至对于一个人来说。考虑到灯可能只是被关掉了;-)
  • 如果您只关心平移,而不关心旋转和缩放,基于phase correlation 的模板匹配技术将是最有效的方法。 OpenCV 之类的库offer this functionality

标签: java image-processing image-segmentation template-matching


【解决方案1】:

给定 javaCV 和 openCV this sn-p 代码可以完成这项工作:

public class RunTest1
{   
  public static void main(String args[])
  { 

    IplImage src = cvLoadImage("C:\\Users\\Nespresso\\Desktop\\cervelo.jpg",0);
    IplImage tmp = cvLoadImage("C:\\Users\\Nespresso\\Desktop\\subImage.jpg",0);    

    IplImage result = cvCreateImage(cvSize(src.width()-tmp.width()+1, src.height()-tmp.height()+1), IPL_DEPTH_32F, 1);
    cvZero(result);

    //Match Template Function from OpenCV
    cvMatchTemplate(src, tmp, result, CV_TM_CCORR_NORMED);

    double[] min_val = new double[2];
    double[] max_val = new double[2];

    CvPoint minLoc = new CvPoint();
    CvPoint maxLoc = new CvPoint();

    //Get the Max or Min Correlation Value      
    cvMinMaxLoc(result, min_val, max_val, minLoc, maxLoc, null);

    System.out.println(Arrays.toString(min_val));
    System.out.println(Arrays.toString(max_val));

    CvPoint point = new CvPoint();
    point.x(maxLoc.x()+tmp.width());
    point.y(maxLoc.y()+tmp.height());

    cvRectangle(src, maxLoc, point, CvScalar.WHITE, 2, 8, 0);//Draw a Rectangle for Matched Region

    cvShowImage("Lena Image", src);
    cvWaitKey(0);
    cvReleaseImage(src);
    cvReleaseImage(tmp);
    cvReleaseImage(result);

}    

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2015-03-28
    • 1970-01-01
    • 2019-05-09
    相关资源
    最近更新 更多