此问题与我的其他问题here有关。基本上,我在使用cv :: imshow(" window",mat)时遇到以下异常:
OpenCV错误:cv :: MatSize :: operator()中的断言失败(p [-1]< = 2),文件C:\ builds \ master_PackSlave-win64-vc12-shared \ opencv \ modules \ core \ include \ opencv2 \ core / mat.inl.hpp,第1097行
没有意义:我尝试了显示3D cv :: Mat文件(CV_32F),并试图将其转换为CV_8U格式并尝试显示它。两次都给出了同样的错误。
相关代码片段:
cv::Mat depthMat( height, width, CV_8UC1 );
depthMat包含深度图。
然后我宣布normMat将包含每个深度像素的表面法线
int sizes[3] = { height, width, 3 };
cv::Mat normMat(3, sizes, CV_32F, cv::Scalar::all(0));
//for loop
//normal calculation
normMat.at<float>(i, j, 0) = fVec3[0];
normMat.at<float>(i, j, 1) = fVec3[1];
normMat.at<float>(i, j, 2) = fVec3[2];
//end for loop
然后我尝试将此曲面法线图像显示为RGB图像,标准化在0到255之间(我也尝试过在文档中给出的1到0之间,但也没有工作)。
cv::Mat normColorMap(height, width, CV_8UC3);
normMat.convertTo(normColorMap, CV_8U, 0, 255);
cv::namedWindow("Normals");
cv::imshow("Normals", normColorMap);
如果我尝试显示normMat,我会得到同样的错误。基本上,我不确定我做错了什么,因为convertTo函数没有抛出任何错误。任何建议表示赞赏。提前谢谢。
编辑:代码改变了一下但是以下是我的嵌套for循环:
for (int i = 5; i < height; i++){
for (int j = 5; j < width-5; j++){
cv::Point3f p1(i, j, (float)depthMat.at<unsigned char>(i, j));
cv::Point3f p2(i - 5, j, (float)depthMat.at<unsigned char>(i - 5, j));
cv::Point3f p3(i, j + 5, (float)depthMat.at<unsigned char>(i, j + 5));
//compute vector in vertical and horizontal direction
float fVec1[3];
float fVec2[3];
float fVec3[3];
fVec1[0] = p2.x - p1.x;
fVec1[1] = p2.y - p1.y;
fVec1[2] = p2.z - p1.z;
fVec2[0] = p3.x - p1.x;
fVec2[1] = p3.y - p1.y;
fVec2[2] = p3.z - p1.z;
//Computer the cross product of these 2 vectors in the image plane
fVec3[0] = (fVec1[1] * fVec2[2]) - (fVec1[2] * fVec2[1]);
fVec3[1] = (fVec1[2] * fVec2[0]) - (fVec1[0] * fVec2[2]);
fVec3[2] = (fVec1[0] * fVec2[1]) - (fVec1[1] * fVec2[0]);
//Normalize the surface normal vector (fVec3)
float flen = sqrt(fVec3[0] * fVec3[0] + fVec3[1] * fVec3[1] + fVec3[2] * fVec3[2]);
fVec3[0] = fVec3[0] / flen;
fVec3[1] = fVec3[1] / flen;
fVec3[2] = fVec3[2] / flen;
normMat.at<float>(i, j, 0) = fVec3[0];
normMat.at<float>(i, j, 1) = fVec3[1];
normMat.at<float>(i, j, 2) = fVec3[2];
}
}