我无法弄清楚如何正确访问3D cv::Mat数组的元素。以下代码在Vivado HLS中运行,但由于非描述性错误而失败。 Vivado HLS是否存在问题,或者我无法正确读取值?
cv::Mat img = cv::Mat(cv::Size(100,100),CV_MAKETYPE(CV_8U,5)); // should create a 100x100x5 array
uchar x;
x = img.at<uchar>(0,0,0); // works fine when reading from third dimension at 0
x = img.at<uchar>(0,0,1); // fails when reading from third dimension at 1
错误:
@E Simulation failed: SIGSEGV.
ERROR: [SIM 211-100] CSim failed with errors.
最佳答案
的确,使用多维数据时Mat::at<T>
存在一些问题。
看看:Post
我建议不使用Mat::at<T>
直接访问像素:
int main(int argc, char** argv)
{
cv::Mat img = cv::Mat(cv::Size(5, 5), CV_MAKETYPE(CV_8U, 5));
std::cout << "Matrix = " << " " << std::endl << img <<std::endl;
for (unsigned int band = 0; band < img.channels(); band++) {
for (unsigned int row = 0; row < img.rows; row++) {
for (unsigned int col = 0; col < img.cols; col++) {
int PixelVal = static_cast<int>(img.data[img.channels()*(img.cols*col + row) + band]);
std::cout << PixelVal << std::endl;
}
}
}
return 0;
}
*注意:这是访问Mat的简便方法,但如果要提高效率,请使用数据指针。