OpenCV Mat數據類型指針ptr的使用


OpenCV Mat數據類型指針ptr的使用

    cv::Mat image = cv::Mat(400, 600, CV_8UC1); //寬400,長600
    uchar * data00 = image.ptr<uchar>(0);
    uchar * data10 = image.ptr<uchar>(1);
    uchar * data01 = image.ptr<uchar>(0)[1];

解釋:

  • 定義了一個Mat變量image。
  • data00是指向image第一行第一個元素的指針。
  • data10是指向image第二行第一個元素的指針。
  • data01是指向image第一行第二個元素的指針。

注意:
如果你的程序使用來image.ptr指針,並且出現了下面這樣的錯誤:(假設你使用的軟件是Visual Studio 201x)

某某.exe中的 0x75065b68 處有未經處理的異常:Microsoft C++ 異常; 內存位置0x85e790處的cv::Exception

這可能是因為你不理解image.ptr這個指針,犯了這樣的錯誤:image.ptr(1);指的不是image中第二個像素,而是第一行第二個像素的指針。
使用上面的代碼舉例:image有400行,有400*600個像素。假設現在你想得到第3行第42個像素的指針,如果你寫成:

uchar * data = image.ptr<uchar>(3*image.cols + 42);

這樣寫是錯誤的,會出現上面的錯誤。你得到的不是第3行第42個像素的指針,而是第(3×image.cols + 42)行第0個像素的指針,因為沒有(3×image.cols + 42)行,所以沒有這個指針,所以錯誤。
正確的寫法:

uchar * data = image.ptr<uchar>(3)[42];

所以要注意這一點:如果程序可以正常編譯,但是運行時出錯,很有可能是你給指針賦值的時候,索引值溢出指定范圍,指針亂指,導致程序跑偏,所以只有在運行時才能發現錯誤。


    cv::Mat image = cv::Mat(400, 600, CV_8UC3); //寬400,長600,3通道彩色圖片
    uchar * data000 = image.ptr<uchar>(0);
    uchar * data100 = image.ptr<uchar>(1);
    uchar * data001 = image.ptr<uchar>(0)[1];
    uchar * data
    cv::Mat image = cv::Mat(400, 600, CV_8UC3); //寬400,長600,3通道彩色圖片
    cv::Vec3b * data000 = image.ptr<cv::Vec3b>(0);
    cv::Vec3b * data100 = image.ptr<cv::Vec3b>(1);
    cv::Vec3b * data001 = image.ptr<cv::Vec3b>(0)[1];
    cv::Vec3b * data


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM