cv ::内存位置的异常

时间:2014-07-28 09:35:46

标签: c++ opencv

我是openCV的新手,我使用它时遇到很多问题。 我必须在cv :: Mat上使用指针,我甚至无法初始化它:

cv::Mat* _image_3D = new cv::Mat();
*_image_3D = cv::Mat::zeros(height,width,CV_32FC3);
Point3f vt = (Point3f)_image_3D->at<uchar>(0,0);
std::cout << vt.x << " " << vt.y << " " << vt.z<< " ";

我认为zeros会初始化我的Matrix,所以通常可以访问矩阵的第一个点,但是当我执行代码时我得到了这个错误:

Unhandled exception at 0x761cb727 in glwidget.exe: Microsoft C++ exception: cv::Exception at memory location 0x002eeda0.

glwidget是我的申请

我尝试对我加载的矩阵执行此操作并且它有效:

 Mat mat = imread( "..XXX.jpg",0);
 Point3f vt = (Point3f)mat.at<uchar>(0,0);
 std::cout << vt.x << " " << vt.y << " " << vt.z << " ";

我实际上需要访问/编辑我的matric像素!

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用

创建一个3通道浮动Mat,初始化为零
cv::Mat image_3D(height, width, CV_32FC3, cv::Scalar(0.0f, 0.0f, 0.0f));

cv::Mat image_3D = cv::Mat::zeros(height, width, CV_32FC3);

此外,您使用at<uchar>()进行访问是错误的。它应该是(例如)

Point3f vt(cv::Vec3f>(0,0));

(尽管有许多可能的排列,例如Point3f vt = mat.at<Vec3f>(0,0);

在您的代码中,Point3f vt = (Point3f)mat.at<uchar>(0,0); 可能为您工作,因为 at<uchar>()返回对单个字节的引用,当您将其转换为Point3f时,正确的数据与该字节相邻。如果没有更深入的C ++知识,我不希望这对每个编译器起作用。 但是:对于我来说,VS2012在发布模式下,两种访问方法都会产生相同的错误数据,而在调试模式下,两者都失败了at<>()中的断言,因为uchar的大小不是与Mat的elemSize1()相同。 也许您在第一种情况下使用了调试模式,在第二种情况下使用了释放模式?

如果您以序列方式访问像素,at<>()是效率低下的方法。见http://docs.opencv.org/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#the-efficient-way