2012-06-02 2 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); 
    } 

} 

Я использовал этот код для преобразования «hough transform» в opencv для обнаружения объекта на изображении. и запуск программы без каких-либо ошибок. но в результате появляется только консольное окно и быстро исчезает. что я должен сделать для этого.Как решить ошибку в преобразовании hough в opencv и C++

+0

Программа должна в идеале ждать неопределенно на 'cvWaitKey (0);', но поскольку это не так, я подозреваю, может быть, изображение вообще не загружается (в первом условии if). Можете ли вы перепроверить это? – SuperSaiyan

+0

путь изображения правильный. Есть ли способ проверить, загружен ли образ или нет? – Thar1988

+0

То, как вы это делаете, достаточно хорошо - проверка на то, что возвращаемое значение будет отличным от нуля. Входит ли элемент управления в if-блок? – SuperSaiyan

ответ

1

Вот некоторые плохие логики у вас есть там:

  • первые: если argc больше или меньше, чем 2, ваш основной код не будет работать, и вы будете уведомлены об этом.
  • 2nd: если по какой-либо причине cvLoadImage() не удалось, вы также не будете уведомлены об этом.

Я подозреваю, что одна из этих 2 вещей происходит: либо вы не вызывая программу с правильным числом параметров, или cvLoadImage() не удается (не удалось найти файл или тип файла не поддерживается).

Я предлагаю вам добавить соответствующие отладки (вызовы printf), чтобы узнать, что происходит на самом деле.

EDIT:

Несколько примечаний:

  • Если изображение загружается в "qqqq.jpg" и если вы запускаете вашу программу из Visual Studio, вы должны поместить изображение внутри той же папке, что и файлы исходного кода (а не в папке, где находится ваш .exe);
  • Если вы используете Windows, и пытается загрузить изображение, используя полный путь, не забудьте, чтобы избежать косой черты: C:\\folder\\qqqq.jpg
  • FYI, argc == 2 означает, что вы запустить приложение из командной строки, используя формат : app.exe param1
+0

спасибо, сэр, теперь это работает. я изменяю как 'code' (argc <2) – Thar1988

Смежные вопросы