gpt4 book ai didi

c++ - OpenCV 投资返回率错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:35 27 4
gpt4 key购买 nike

我正在尝试制作一个程序,通过在图像上滑动 ROI 并将 ROI 与模板进行比较来识别模式,它将比较 ROI 和模板的像素值,每次将计数器加 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

我在下面留下代码:

#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

抱歉,我的代码中的注释是西类牙语,英语不是我的母语,正如您现在猜到的那样,我真的不知道我的错误在哪里但是......我希望它很简单提前谢谢你!

最佳答案

这意味着您正试图将 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...
}

关于c++ - OpenCV 投资返回率错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29712057/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com