我是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像素!
谢谢!
答案 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