簡體   English   中英

OpenCV錯誤:斷言失敗,mat.cpp行537

[英]OpenCV Error: Assertion failed, mat.cpp line 537

http://pastebin.com/5ZeMvm2C是我的項目中的頭文件。

在第249行有skeleton.at(yaxis,xaxis + 1)。當我在項目中鍵入此代碼時,出現此錯誤:

**OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)si
ze.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channel
s()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3
) - 1))*4) & 15) == elemSize1()) in unknown function, file c:\opencv\build\inclu
de\opencv2\core\mat.hpp, line 537**

// mat.cpp line 537 is:
    template<typename _Tp> inline _Tp& Mat::at(int i0, int i1)
        {
            CV_DbgAssert( dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] &&
                (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) &&
                CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
            return ((_Tp*)(data + step.p[0]*i0))[i1];
        }

怎么了?

http://pastebin.com/gqJ5RpBU也是我的.cpp文件。

如錯誤消息所述,您有一個失敗的OpenCV運行時斷言。

正如您在問題中所寫的那樣,失敗的斷言位於Mat::at函數內部。

您必須在代碼中找到對Mat::at的調用(或多個調用) Mat::at這會給您帶來錯誤。

如您在OpenCV幫助頁面上所見, Mat::at是帶有一個,兩個或三個參數的模板函數,斷言失敗可能有多種原因:

  1. 您使用了錯誤的模板參數(例如,對於2D Mat對象,請參見在opencv中使用Mat :: at(i,j)
  2. 參數是錯誤的,例如在對template<typename T> T& Mat::at(int i, int j)的調用中, i應該在0到行數減一之間,而j應該在之間0 ,列數減一。 如果您有一個包含100行的圖像,並且在第101行請求一個元素,則斷言將失敗。 在這種情況下,經常出現一對一的錯誤

更具體地說,斷言失敗,因為以下bool至少之一為false

  1. dims <= 2
  2. data
  3. (unsigned)i0 < (unsigned)size.p[0]
  4. (unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())
  5. CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1())

上面的boolMat類的范圍內是有意義的。

此外,請注意幫助說明:

為了提高性能,僅在Debug配置中執行索引范圍檢查

因此,在您的Release配置中,您不會有失敗的斷言,而可能是某處崩潰。

從鏈接的源代碼看,我看來您在Windows上,如果是這樣,並且如果您具有Visual Studio,則建議您從源代碼構建OpenCV,在Mat::at內放置一個斷點,然后轉到調試您的代碼,以查看先前的bool是什么false

Mat::at()方法已作為模板實現,使用該函數之前必須了解圖像的類型。

檢查圖像的通道。 對於單通道圖像(8UC1),應按以下方式操作圖像像素:

image.at<uchar>(row, col) = 255; 

對於三通道彩色圖像(8UC3),應使用以下功能:

image.at<cv::Vec3b>(row, col)[channel] = 255;

如果通道沒有問題,則應檢查at(i, j) ,我顯示該行,j顯示該列。 換句話說,我等於Point.y,j等於Point.x

暫無
暫無

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

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