2012-06-02 31 views
1
#include <cv.h> 
#include <highgui.h> 
#include <math.h> 

int main(int argc, char** argv) 
{ 
    IplImage* src; 
    if(argc == 2 && (src=cvLoadImage("qqqq.jpg", 0))!= 0) 
    { 
     IplImage* dst = cvCreateImage(cvGetSize(src), 8, 1); 
     IplImage* color_dst = cvCreateImage(cvGetSize(src), 8, 3); 
     CvMemStorage* storage = cvCreateMemStorage(0); 
     CvSeq* lines = 0; 
     int i; 
     cvCanny(src, dst, 50, 200, 3); 
     cvCvtColor(dst, color_dst, CV_GRAY2BGR); 
#if 1 
     lines = cvHoughLines2(dst, 
           storage, 
           CV_HOUGH_STANDARD, 
           1, 
           CV_PI/180, 
           100, 
           0, 
           0); 

     for(i = 0; i < MIN(lines->total,100); i++) 
     { 
      float* line = (float*)cvGetSeqElem(lines,i); 
      float rho = line[0]; 
      float theta = line[1]; 
      CvPoint pt1, pt2; 
      double a = cos(theta), b = sin(theta); 
      double x0 = a*rho, y0 = b*rho; 
      pt1.x = cvRound(x0 + 1000*(-b)); 
      pt1.y = cvRound(y0 + 1000*(a)); 
      pt2.x = cvRound(x0 - 1000*(-b)); 
      pt2.y = cvRound(y0 - 1000*(a)); 
      cvLine(color_dst, pt1, pt2, CV_RGB(255,0,0), 3, 8); 
     } 
#else 
     lines = cvHoughLines2(dst, 
           storage, 
           CV_HOUGH_PROBABILISTIC, 
           1, 
           CV_PI/180, 
           80, 
           30, 
           10); 
     for(i = 0; i < lines->total; i++) 
     { 
      CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); 
      cvLine(color_dst, line[0], line[1], CV_RGB(255,0,0), 3, 8); 
     } 
#endif 
     cvNamedWindow("Source", 1); 
     cvShowImage("Source", src); 

     cvNamedWindow("Hough", 1); 
     cvShowImage("Hough", color_dst); 

     cvWaitKey(0); 
    } 

} 

我在opencv中使用此代碼來檢測圖像中的對象。和程序運行沒有任何錯誤。但結果是隻有一個控制檯窗口很快出現並迅速消失。我應該爲此做些什麼。如何解決opencv和C++中的hough變換中的錯誤

+0

程序應該無限期地等待'cvWaitKey(0);'但由於它不是,我懷疑,可能是圖像沒有得到加載(在第一個條件)。你能重新檢查一下嗎? – SuperSaiyan

+0

圖像路徑是否正確。是否有任何方法檢查圖像是否加載? – Thar1988

+0

你這樣做的方式已經足夠了 - 檢查返回值是否爲非零。控制進入if塊嗎? – SuperSaiyan

回答

1

那你就錯過了有一些不好的邏輯:

  • 1:如果argc比2大或變小,主代碼將無法運行,也不會對你這件事通知。
  • 第二:如果因爲任何原因cvLoadImage()失敗,您也不會收到通知。

我懷疑正在發生的這2兩件事:要麼你是不是用的參數正確的叫號程序,或cvLoadImage()失敗(無法找到文件或文件類型不支持)。

我建議你添加適當的調試(printf調用)來查看真正發生了什麼。

編輯:

有兩點要注意:

  • 如果你的圖像被加載"qqqq.jpg",如果你是在Visual Studio中運行程序,你需要把圖像內與您的源代碼文件相同的文件夾(而不是您的.exe所在的文件夾);
  • 如果您使用的是Windows,並嘗試使用完整路徑來加載圖像,不要忘記逃跑的斜線:C:\\folder\\qqqq.jpg
  • 僅供參考,argc == 2意味着你在命令行中使用格式運行你的應用程序:app.exe param1
+0

謝謝先生,現在正在工作。我更改爲'code'(argc <2) – Thar1988

相關問題