2017-07-05 94 views
1

當使用FAST特徵檢測器我用初學OpenCV的,並使用在OpenCV中的FAST特徵檢測器簡單地得到一個圖像的關鍵點閱讀位置0xFFFFFFFFFFFFFFFF。訪問衝突的OpenCV

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/features2d.hpp" 

std::vector<cv::KeyPoint> kp; 

int main() 
{ 
    cv::Mat img = cv::imread("im.jpg", 0); 
    cv::FAST(img, kp, 100, true); 

    cv::Mat img2; 
    cv::drawKeypoints(img, kp, img2 , CV_RGB(255, 0, 0)); 
    cv::imshow("Display", img2); 
    cv::waitKey(0); 
    cv::destroyWindow("Display"); 

    return 0; 
} 

但調試代碼(調試模式)時: 我發現的矢量KP中(作爲關鍵點矢量傳遞)到FAST()具有大尺寸(KP = {大小= 658812287755660302})這是不可能的。但是生成表示正確關鍵點的圖像。上面提到的訪問衝突錯誤信息出現在調試結束時。

在釋放模式: 代碼運行正常首先示出圖像中的關鍵點。當圖像窗口關閉時,程序崩潰。調試時,kp具有合理的大小(kp = {size = 427})。

當代碼在調試模式下無需調試運行,應用程序錯誤彈出,說明內存在的0xffffffff無法讀取。

調用堆棧是如圖所示here,這沒有任何意義,我。

我在做什麼錯?它與我初始化矢量或其他東西的方式有關嗎?

+0

哪裏我們發現您使用的是測試,'im.jpg'的形象呢? – Xirema

+0

我無法使用[此示例圖像](http://imgur.com/a/2iV3q)與您的代碼重現此問題。 [結果](http://imgur.com/a/MWkIw)。 – Xirema

+1

檢查您的鏈接器屬性。您可以在發佈中鏈接OpenCV調試庫,反之亦然。或者你正在使用與不同的編譯器/體系結構編譯的OpenCV版本 – Miki

回答

0

我無法使用自己的圖像或使用您提供的圖像來重現此問題。因此,我必須得出結論,您的構建環境存在問題。

  • 確保您已正確設置項目包含和庫,包括OpenCV默認使用的共享庫。
  • 確保您使用的是Visual Studio 2015(或與二進制兼容的VS2017)來編譯您的代碼。
+0

我得到了同樣的錯誤甚至設置你的圖像..但使用VS 2013有什麼問題?其他opencv項目工作得很好.. – Heshan

+1

@鶴山您正在爲您的項目使用OpenCV 3.20。運行的OpenCV 3.20二進制文件是針對Visual Studio SDK 14.x.yyyy編譯的,該文件對應於VS2015(14.0.yyyy)或VS2017(14.1.yyyy),它們相互二進制兼容,但不適用於其他版本的視覺工作室。如果您使用Visual Studio 2013自己編譯和構建OpenCV對象文件,那麼您需要檢查編譯過程並確保您沒有犯任何錯誤。 – Xirema

+0

我使用的是opencv 2.4.11(vc12)。現在釋放模式不會產生任何錯誤。但調試模式在調用drawkeypoints()時會導致opencv錯誤。我使用了'kp.release(1000)',它在某種程度上包含了kp向量的增長,但是大於在釋放模式下運行時的向量對象(或FAST())的異常行爲之間的鏈接。和執行模式?現在VS和OpenCV版本不可能是這個問題,他們可以嗎? – Heshan