Error con OpenCV ROI
Estoy tratando de hacer un programa que identifique un patrón deslizando un ROI sobre una imagen y comparando el ROI con una plantilla, comparará los valores de píxeles del ROI y la plantilla y aumentará un contador en 1 cada vez que un píxel coincida, luego comparo el contador con un umbral, si pasa un rectángulo se dibujará, si no, continuará deslizándose a través de la imagen, si ejecuto el depurador en él, no muestra errores deslizándose a través de la imagen, pero si ejecutarlo normalmente arroja la siguiente excepción:
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
Os dejo el código de abajo:
#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;
}
No puedo cargar las imágenes que estoy usando debido a la reputación ... pero la imagen original es de 800 x 450 y la plantilla buscada en la imagen es de 131 x 132
lamento que los comentarios en mi código estén en español, el inglés no es mi lengua materna, como ya habrás adivinado, realmente no sé dónde está mi error, pero ... ¡espero que sea simple, gracias de antemano!