例外:opencv imshow断言失败

时间:2015-05-22 21:29:41

标签: opencv computer-vision imshow

此问题与我的其他问题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];



            }
        }

0 个答案:

没有答案