2013-11-26 130 views
3

http://pastebin.com/5ZeMvm2C是我的項目中的頭文件。OpenCV錯誤:斷言失敗,mat.cpp行537

有在行249 skeleton.at(Y軸,X軸+ 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文件。

回答

4

如錯誤消息所示,您的OpenCV運行時斷言失敗。

正如你在你的問題中寫的,失敗的斷言是在Mat::at函數中。

您必須在您的代碼中找到致電的電話號碼(或電話號碼),才能給出錯誤信息。

正如你可以在OpenCV help pageMat::at看到的是一個,兩個或三個參數的模板功能,在斷言失敗的情況有多種原因:你使用了錯誤的模板參數

  1. (見例如Using Mat::at(i,j) in opencv for a 2-D Mat object
  2. 參數是錯誤的,例如,在到template<typename T> T& Mat::at(int i, int j)呼叫,i應該是0和行減去一個數之間,j應該是0和列減一的數量之間。如果你有一個100行的圖像,並且你要求第101行的元素,斷言將失敗。 Off-by-one errors在這種情況下很常見。

具體而言,斷言失敗,因爲以下bool S的至少一個是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())

以上bool s在Mat類的範圍內有意義。

此外請注意幫助說:

For the sake of higher performance, the index range checks are only performed in the Debug configuration

等在發佈配置,你會不會有失敗的斷言,但可能介於崩潰。

從你鏈接的來源看來,你在Windows上,如果這是真的,並且如果你有Visual Studio,我建議你從源代碼構建OpenCV,然後在Mat::at之內放置一個斷點,然後調試您的代碼,以便查看以前的bool s是false

+0

其他讀者:你可以把斷點的錯誤行,當它擊中,利用一步進VS按鈕轉到mat.cpp文件看看'data','dims',size.p的價值[0],...所以你可以找到哪個值導致錯誤 – Arash

0

Mat::at()方法已經被實現爲一個模板,你必須知道的圖像類型時使用的功能之前。

檢查圖像的通道。 單通道圖像(8UC1),你應該操縱圖像的像素作爲在:

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

三幅通道彩色圖像(8UC3),則應該使用該函數如下所示:

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

如果該頻道是沒有問題的,你應該檢查參數at(i, j),我介紹這一行,j出現col。換句話說,我等於Point.y,j等於Point.x

相關問題