[英]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
是帶有一個,兩個或三個參數的模板函數,斷言失敗可能有多種原因:
template<typename T> T& Mat::at(int i, int j)
的調用中, i
應該在0
到行數減一之間,而j
應該在之間0
,列數減一。 如果您有一個包含100行的圖像,並且在第101行請求一個元素,則斷言將失敗。 在這種情況下,經常出現一對一的錯誤 。 更具體地說,斷言失敗,因為以下bool
至少之一為false
:
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())
上面的bool
在Mat
類的范圍內是有意義的。
此外,請注意幫助說明:
為了提高性能,僅在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.