2015-04-18 2 views
2

Я пытаюсь создать программу, которая будет идентифицировать шаблон путем перемещения ROI по изображению и сравнения ROI с шаблоном, он будет сравнивать значения пикселей ROI и шаблона и увеличивать счетчик на 1 каждый раз, когда пиксель совпадает, тогда я сравниваю счетчик с порогом, если он пройдет прямоугольник, будет рисоваться, если нет, он будет продолжать скользить по изображению, если я запустил отладчик на нем, он не обнаруживает ошибок, скользящих корыта изображения, но если я запускаю его обычно он бросает следующее исключение:Ошибка с OpenCV ROI

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in Mat, file /home/abuild/rpmbuild/BUILD/opencv-2.4.6.1/modules/core/src/matrix.cpp, line 323 
terminate called after throwing an instance of 'cv::Exception' 
what(): /home/abuild/rpmbuild/BUILD/opencv-2.4.6.1/modules/core/src/matrix.cpp:323: error: (-215) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows in function Mat 

оставляет код Сильфона:

#include <stdio.h> 
#include <stdlib.h> 
#include <iostream> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 


using namespace std; 
using namespace cv; 

Mat   iOrig;       //imagen que se analizara 
Mat   patron;       //patron buscado 
Point  corner1,corner2;    //esquinas del ROI 
bool  tresholdpass;     //boolean returned by comparar() 
Rect  box;       //rectangulo usado para crear el ROI 
float  porcentaje;      //distancia a recorrer que sera dada por el tamano de la imagen muestra para el patron 
float  treshold;      //treshold que debera ser superado para que se considere similar o igual al patron 
float  valpx;       //valor almacenado en el pixel comparado 
float  contTreshold;     //contador a comparar contra el porcentaje requerido para considerarse como patron encontrado 
float  totpxpat;      //cantidad de pixeles de la imagen muestra del patron 
float  porctreshold;     //porcentaje representativo para considerar que se encontro el patron en esa ROI 

bool comparar(Mat region, Mat patron){ 

    int i=0; 
    int j=0; 
    contTreshold=0; 

    for (i=0;i<patron.cols;i++){ 
     for (j=0;j<patron.rows;j++){ 
      Point a(i,j); 
      if(abs(region.at<float>(a))==abs(patron.at<float>(a))){ 
      //se compara el contenido de el ROI y el patron en un punto 
       contTreshold++;    //en caso de ser cierto, el contador aumenta en 1 
      } 
     } 

    } 
    totpxpat = patron.rows*patron.cols;  //se cuentan la cantidad de pixeles dado columnas*renglones 
    porctreshold = 0.8;      //el porcentaje que se usara para el treshold 
    treshold = totpxpat * porctreshold;  //el treshold que determinara si se cumple el porcentaje de la imagen 
             //para saber si cumple el patron o no, en caso de q se supere, retornara verdadero 
             //en caso de que no se supere retornara falso y se elegira otro ROI para analizar 
    if (contTreshold>treshold){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

int main() { 

    namedWindow("imagen"); 
    namedWindow("segmento"); 

    iOrig = imread("/home/diego/Downloads/figuras.jpg",CV_LOAD_IMAGE_GRAYSCALE); 
    patron = imread("/home/diego/Downloads/patron.jpg",CV_LOAD_IMAGE_GRAYSCALE); 

    imshow("imagen",iOrig); 
    imshow("segmento",patron); 
    corner1.x = 1; 
    corner1.y = 1; 
    corner2.x = patron.cols; 
    corner2.y = patron.rows; 


    porcentaje = (int)patron.cols * 0.05; 

    while (corner2.x<iOrig.rows-(patron.rows*2)){ 
     while(corner2.y<iOrig.cols-(patron.cols*2)){ 
      box.width = abs (corner1.x-corner2.x)+1; 
      box.height = abs (corner1.y - corner2.y)+1; 
      box.x = min(corner1.x, corner2.x); 
      box.y = min(corner1.y, corner2.y); 


     //se crea una imagen de la region de interes seleccionada apartir de las 2 esquinas de la ROI 
      Mat  region(iOrig,box);    //region de interes que sera comparada 

     //se manda a comparar el ROI con el patron 
      tresholdpass=comparar(region,patron); 
      if (tresholdpass == true){ 
       Mat local_img = iOrig.clone(); 
       rectangle(local_img,corner1,corner2,Scalar(0,0,255)); 
       imshow("imagen",local_img); 

      } 
      corner1.x+=porcentaje; 
      corner2.x+=porcentaje; 
     } 
     corner1.y+=porcentaje; 
     corner2.y+=porcentaje; 
    } 

    while (char(waitKey(1))!= 'q'){} 
    return 0; 
} 

Я не могу загрузить изображения им с помощью из-за репутации ... но исходное изображение 800 х 450 и шаблон ищется в изображении 131 х 132

жаль комментариев в мой код быть на испанском языке , Английский не мой родной язык, как вы уже догадались, я действительно не знаю, где моя ошибка, но ... Надеюсь, это просто спасибо заранее!

ответ

3

Это означает, что вы пытаетесь получить область ROI из плоскости изображения. Вы должны убедиться, что область ROI находится внутри плоскости изображения, чтобы избежать сбоя.

В вашем случае, вы можете сделать так:

// check the box within the image plane 
if (0 <= box.x 
    && 0 <= box.width 
    && box.x + box.width <= iOrig.cols 
    && 0 <= box.y 
    && 0 <= box.height 
    && box.y + box.height <= iOrig.rows){ 
    // box within the image plane 
    Mat region(iOrig, box); 
} 
else{ 
    // box out of image plane, do something... 
} 
+0

спасибо я исправил и да моя ошибка была в петлях, я был вне границ изображения –