我使用OpenTLD C ++实现作为库 - 仅包含libopentld文件夹。我已经多次成功编译了主要的可执行文件,它运行顺利。但是使用该库似乎有一个奇怪的特定错误。
我使用opencv 3.0作为默认的opentld和我自己的项目。
使用-g -O0
和gdb
运行会提供以下输出:
Program terminated with signal SIGSEGV, Segmentation fault.
#0 calcVariance (off=0x7f3e060f45b0, this=0x15568a0) at libs/opentld/src/libopentld/tld/VarianceFilter.cpp:67
67 float mX = (ii1[off[3]] - ii1[off[2]] - ii1[off[1]] + ii1[off[0]]) / (float) off[5]; //Sum of Area divided by area
(gdb) bt
#0 calcVariance (off=0x7f3e060f45b0, this=0x15568a0) at libs/opentld/src/libopentld/tld/VarianceFilter.cpp:67
#1 tld::VarianceFilter::filter (this=0x15568a0, i=23100) at libs/opentld/src/libopentld/tld/VarianceFilter.cpp:89
#2 0x00000000004141cd in tld::DetectorCascade::detect (this=0x1556780, img=...) at libs/opentld/src/libopentld/tld/DetectorCascade.cpp:317
#3 0x00000000004115bc in tld::TLD::initialLearning (this=0x15437c0) at libs/opentld/src/libopentld/tld/TLD.cpp:248
#4 0x0000000000411e0c in tld::TLD::selectObject (this=<optimized out>, img=..., bb=bb@entry=0x7ffcbe8caa70)
当我拨打TLD::selectObject(img, roi)
时,会发生这种情况。
我已经隔离了数组访问,看起来off[5]
是罪魁祸首,但我不确定。似乎他们都访问没有为他们定义的内存。在IntegralImage
中,永远不会定义宽度和高度,但按照惯例,数据数组的大小为width*height
。 (以及我记录的数组访问似乎超出了该范围)
我不知道为什么这适用于普通的可执行文件但不能从我自己的程序调用。我看了很多次,将正常的一个剥离到几个电话,它仍然有效。它是否可能与仅使用Mat对象而不是IplImage有关?
这是我调用opentld的代码:
using namespace cv;
Target OpenTLD::findTarget(cv::Mat HSV, bool restart) {
Target t;
cvtColor(HSV, t.image, COLOR_HSV2RGB);
Mat BGR;
cvtColor(t.image, BGR, COLOR_RGB2BGR);
Mat grey(HSV.size(), CV_8UC1);
int ch[] = {2, 0};
mixChannels(&HSV, 1, &grey, 1, ch, 1);
if (restart) {
started = true;
Rect roi = selectedROI();
tld->detectorCascade->imgWidth = HSV.cols;
tld->detectorCascade->imgHeight = HSV.rows;
tld->detectorCascade->imgWidthStep = HSV.step;
tld->processImage(BGR);
tld->selectObject(grey, &roi);
} else if (started) {
t.roi = ROI(*tld->currBB);
tld->processImage(BGR);
}
return t;
}
我已验证图片和投资回报率是有效值。
答案 0 :(得分:0)
这是由于HSV.step
提供了错误的值。我使用了宽度值,它工作得很好。