Видеокадр OpenCV не показывает вывод Собеля - PullRequest
2 голосов
/ 24 ноября 2011

Это продолжение вопроса от видеокадр OpenCV выдает ошибку Я думаю, что закрыл его, я новичок в Stackoverflow.

У меня есть код ниже, что я пытаюсь увидеть его изображение края Собела. Тем не менее, программа работает, но на экране появляется только серый экран, где, если я наведу курсор мыши, курсор исчезнет. Кто-нибудь видит ошибку? или это неправильное понимание структур данных, которые я использую

IplImage *frame, *frame_copy = 0;

// capture frames from video
CvCapture *capture = cvCaptureFromFile( "lightinbox1.avi");
//Allows Access to video propertys
cvQueryFrame(capture);

//Get the number of frames
int nframe=(int) cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);

//Name window
cvNamedWindow( "video:", 1 );

//start loop
for(int i=0;i<nframe;i++){
//prepare capture frame extraction
cvGrabFrame(capture);
cout<<"We are on frame "<<i<<"\n";
//Get this frame
frame = cvRetrieveFrame( capture );
con2txt(frame);
frame_copy = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U,frame->nChannels );
//show and destroy frame
cvCvtColor( frame,frame,CV_RGB2GRAY);

 //Create Sobel output
 frame_copy1 = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_16S,1 );
cvSobel(frame_copy,frame_copy1,2,2,3);

cvShowImage("video:",frame_copy1);
cvWaitKey(33);}
cvReleaseCapture(&capture);

Ответы [ 2 ]

1 голос
/ 25 ноября 2011

Я думаю, что у OpenCV возникают проблемы с интеллектуальным отображением вашего 16-битного изображения. Вы можете проверить, так ли это, выполнив следующие действия:

  1. Создание 8-битного изображения (назовите его result8bit). OpenCV хорошо отображает их.
  2. Рассчитать минимум и максимум frame_copy1 (см. cvMinMaxLoc)
  3. Используйте cvScale для преобразования frame_copy1 в result8bit, используя минимальное и максимальное значения для масштабирования изображения
  4. Показать result8bit.

Удачи.

1 голос
/ 24 ноября 2011

В данном случае, я думаю, это потому, что вы создаете целевое изображение с глубиной , чем оригинал:

frame_copy1 = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_16S,1 );

и вы должны делать:

frame_copy1 = cvCreateImage(cvSize(frame->width,frame->height),IPL_DEPTH_8U,1 );

В любом случае, в этом посте показан пример, в котором используется cvSobel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...