Java 如何在图片位置可能改变的图片中检测子集图像

Java 如何在图片位置可能改变的图片中检测子集图像,java,image-processing,image-segmentation,template-matching,Java,Image Processing,Image Segmentation,Template Matching,我在这里的目标只是检测座椅,无论图像位于何处。为了使事情变得更简单,这是屏幕上唯一显示的图像,但图像的位置可能会改变。用户可以将其向右、向左、上下移动,并可能显示图像的一部分。 我读过这本书,它展示了如何“暴力”图像来检测图像的一个子集,但当我尝试它时——我花了100多秒来检测它(真的很长时间,尽管我不寻求实时),而且,我认为我的挑战更简单 问:我在这里应该采取什么方法?我从未尝试过任何与图像处理相关的东西,并且已经准备好走这条路(如果在这里适用的话) 谢谢 这是将在屏幕上显示的图像(可能仅显示

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

我读过这本书,它展示了如何“暴力”图像来检测图像的一个子集,但当我尝试它时——我花了100多秒来检测它(真的很长时间,尽管我不寻求实时),而且,我认为我的挑战更简单

问:我在这里应该采取什么方法?我从未尝试过任何与图像处理相关的东西,并且已经准备好走这条路(如果在这里适用的话)

谢谢

这是将在屏幕上显示的图像(可能仅显示部分图像,假设用户将其一直向右移动,并且仅显示带座椅的后风团)

子集图像始终如下所示:

给定的javaCV和openCV代码片段执行以下任务:

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);

}    
}


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