簡體   English   中英

cv :: Exception在內存位置

[英]cv::Exception at memory location

我是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會初始化我的矩陣,因此通常可以訪問矩陣的第一個點,但是當我執行代碼時,出現此錯誤:

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 << " ";

我實際上需要訪問/編輯矩陣的像素!

謝謝!

您可以使用創建一個初始化為零的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,您的兩種訪問方法都會產生相同的錯誤數據,並且在調試模式下,由於uchar的大小與elemSize1()的大小不同,兩種訪問方法都無法在at<>()斷言。墊。 也許您在第一種情況下使用調試模式,而在第二種情況下使用發布模式?

如果您要順序訪問像素,則at<>()是一種低效率的方法。 參見http://docs.opencv.org/doc/tutorials/core/how_to_scan_images/how_to_scan_images.html#the-efficient-way

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM