我正在尝试制作一个程序,通过在图像上滑动ROI并将ROI与模板进行比较来识别模式,它将比较ROI和模板的像素值,并在每次a时将计数器增加1像素匹配,然后我将计数器与阈值进行比较,如果它通过一个矩形将被绘制,如果没有,它将继续滑动到图像,如果我在其上运行调试器,它显示没有错误滑动通过图像,但如果我正常运行它会抛出下一个异常:
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
我留下代码Bellow:
#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 x 450,图片中搜索的模板为131 x 132
抱歉我的代码中的注释是西班牙语,英语不是我的母语,因为你现在已经猜到了,我真的不知道我的错误在哪里但是...我希望它很简单谢谢你提前!
答案 0 :(得分:9)
这意味着您正试图将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...
}