OpenCV ROI错误 [英] Error with OpenCV ROI
问题描述
我正在尝试创建一个程序,该程序通过在图像上滑动ROI并将ROI与模板进行比较来识别图案,它将比较ROI和模板的像素值,并且每次将计数器增加1.像素匹配,然后我将计数器与阈值进行比较,如果它通过一个矩形将被绘制,如果未通过,它将继续在图像中滑动,如果我在其上运行调试器,它不会在图像中滑动显示错误,但是如果我正常运行它,它将抛出下一个异常:
I am trying to make a program that will identify a pattern by sliding a ROI over an image and comparing the ROI with a template, it will compare pixel values of the ROI and the template and increase a counter by 1 each time a pixel matches, then I compare the counter with a threshold, if it passes a rectangle will be drawn, if not, it will continue to slide trough the image, if I run the debugger on it, it shows no errors sliding trough the image, but if i run it normally it throws the next exception:
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;
}
由于声誉原因,我无法使用im上传图片...,但是原始图片为800 x 450,图片中搜索的模板为131 x 132
I cant upload the images im using because of the reputation... but the original image is 800 x 450 and the template searched in the image is 131 x 132
很抱歉我的代码中的注释是西班牙文,英语不是您现在猜到的母语,我真的不知道我的错误在哪里,但是...我希望这很简单,谢谢您!
sorry about the comments in my code being in Spanish, English is not my native language as you have guessed by now, i really don't know where my mistake is but... I hope it is simple thank you in advance!
推荐答案
这意味着您正在尝试将ROI区域移出图像平面.您应该确保ROI区域在图像平面内,以免发生崩溃.
It means you're trying to get the ROI region out of the image plane. You should make sure the ROI area to be within the image plane in order to avoid the crash.
对于您的情况,您可以这样做:
For your case, you can do like this:
// 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...
}
这篇关于OpenCV ROI错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!