我有一个奇怪的分段错误,就在我即将开始使用该程序的时候,我束手无策。
cout << type2str(fg.type()) << endl; // "8UC4"
if (type2str(fg.type()) == "8UC4"){
//fg is a Mat loaded from fg = imread(path);
fg_channels = fg.at<Vec4b>(v_index, h_index); //The seg fault happens here 100% deterministically
}
else if (type2str(fg.type()) == "8UC3")
{
temp = fg.at<Vec3b>(v_index,h_index);
fg_channels = Vec4b(temp.val[0], temp.val[1], temp.val[2], 255);
}
如何从C++中获得有关分段错误的更多信息?我正在失去理智,这一切都发生在我写进前景的图像范围内。
直到fg的一半,行和列都被迭代了很多次,这才发生。关于如何解决这个问题,有什么想法吗?分段错误是否告诉了我一些关于我遇到的问题的有用信息?当我遇到segfault时,我通常会想到索引越界,但我认为这在这里没有意义。
我不确定你在读什么图像,但这个例子很好:
cv::Mat fg = cv::imread("camera.png", CV_8UC4);
cv::cvtColor(fg, fg, CV_BGR2BGRA);
int v_index = 100000;
int h_index = 1000000;
if (fg.cols < v_index) v_index = fg.cols-1;
if (fg.rows < h_index) h_index = fg.rows-1;
std::cout << type2str(fg.type()) << std::endl; // "8UC4"
if (type2str(fg.type()) == "8UC4") {
//fg is a Mat loaded from fg = imread(path);
cv::Vec4b fg_channels = fg.at<cv::Vec4b>(v_index, h_index); //The seg fault happens here 100% deterministically
std::cout << fg_channels << std::endl;
}
else if (type2str(fg.type()) == "8UC3")
{
cv::Vec3b temp = fg.at<cv::Vec3b>(0,0);
cv::Vec4b fg_channels = cv::Vec4b(temp.val[0], temp.val[1], temp.val[2], 255);
}
std::cout << fg_channels << std::endl;
的输出给出[24,83,74255]
std::cout << type2str(fg.type()) << std::endl; // "8UC4"
的输出给出8UC4,所以您的示例似乎可以工作。
如果你做了这样的事情:
if (fg.cols < v_index) v_index = fg.cols * fg.cols;
if (fg.rows < h_index) h_index = fg.rows * fg.rows;
然后你会得到一个OpenCV错误:Assertion failed (scn == 3 || scn == 4) in cv::cvtColor
,因为你在你提到的行上的图像的可用索引之外。