2013-11-15 108 views
1

我剛開始學習C++和OpenCV。我試圖編寫一個程序,讓我點擊一個像素並在BGR中打印出像素值。到目前爲止,當我點擊時,我的程序返回點擊像素的座標,但是當我想訪問BGR值時,我的程序崩潰了。我從我的網絡攝像頭流式傳輸視頻作爲輸入,並且在編譯時我沒有遇到任何錯誤。嘗試訪問OpenCV中的像素值時發生錯誤

我一直在讀這裏很多類似的問題,但我還沒有找到任何解決方案。

我的程序崩潰時,包括行: 「cv :: Vec3f BGR = matOriginal.at(單擊[0] [0],單擊[0] [1]);」

我的程序的其餘部分如下:

int click[1][2]; 

void mouseEvent(int Event, int x, int y, int flags, void* param) 
{ 
if(Event == CV_EVENT_LBUTTONDOWN) 
{ 
    printf("Valgt pixel: [%d,%d] \n ",x,y); 
    click[0][0] = x; 
    click[0][1] = y; 
} 
} 

int main() 
{ 
VideoCapture capWebcam(0); 
if(capWebcam.isOpened() == false) 
{ 
    printf("Error: capWebcam not accessed successfully \n"); 
    return(1); 
} 
Mat matOriginal; 
char charCheckForEscKey=0; 
while(charCheckForEscKey !=27) 
{ 
    if(capWebcam.read(matOriginal) == NULL) 
    { 
     printf("Error: Frame not read\n \n"); 
     break; 
    } 
    cv::imshow("Original",matOriginal); 
    setMouseCallback("Original",mouseEvent,0); 

    // Print BGR-value when mouseclick 
    if(click[0][0]>0 && click[0][1]>0) 
    { 

    cv::Vec3f BGR = matOriginal.at<cv::Vec3f>(click[0][0],click[0][1]); // When this statement is included, I get an ERROR 

    double B=BGR[0]; // B 
    double G=BGR[1]; // G 
    double R=BGR[2]; // R 


    click[0][0] = 0; // Resetting the click-matrix 
    click[0][1] = 0; 
    } 

    charCheckForEscKey = cv::waitKey(10); 
} 
return(0); 

}

我使用Microsoft Visual C++ 2013次特快

在此先感謝您的幫助

+0

看來你的'click'變量沒有初始化(包含垃圾)。嘗試用'cv :: Vec3f BGR = matOriginal.at (點擊[0] [1],點擊[0] [0]);',你應該檢查'點擊[0] [0]還是點擊[0] [1]'在嘗試訪問'matOriginal'元素之前超出範圍。 – Jigsore

+0

我認爲你需要檢查matOriginal的類型(print matOriginal.type())以確保它確實是Vec3f而不是Vec3b。這個簡單的事實可能可以解釋你所有的問題。 – carlosdc

+0

錯誤是什麼? –

回答

0

好,兩種不同的事情可能會發生在這裏:

  • 崩潰是因爲click未初始化

當你的程序的執行達到循環,並且用戶還沒有按下鼠標按鈕,有沒有辦法告訴哪些值由click存儲,因爲它們很可能是垃圾。

這意味着當您編程第一次運行時,click可能會存儲大於matOriginal的值的值,從而導致您嘗試訪問不存在的索引時崩潰。

始終初始化您的變量!

int main() 
{ 
    click[0][0] = -1; 
    click[0][1] = -1; 
    // ... 
} 

我剛纔說的訪問之前可以通過打印這些值的屏幕進行測試:

std::cout << "X: " << click[0][0] << " Y: " << click[0][1] << std::endl; 
cv::Vec3f BGR = matOriginal.at<cv::Vec3f>(click[0][0], click[0][1]); 
  • 崩潰是因爲cv::Mat期待的X,Y(行,列)值以相反順序(列,行)

我認爲這是mo可能是問題的原因。嘗試:

cv::Vec3f BGR = matOriginal.at<cv::Vec3f>(click[0][1], click[0][0]); 
相關問題