Вопрос по c++, c, image – OpenCV: конвертировать указатель в памяти в изображение

2

У меня есть граббер, который может получить изображения и показать их на экране с помощью следующего кода

<code>while((lastPicNr = Fg_getLastPicNumberBlockingEx(fg,lastPicNr+1,0,10,_memoryAllc))<200) {                                                           
                iPtr=(unsigned char*)Fg_getImagePtrEx(fg,lastPicNr,0,_memoryAllc);                  
                ::DrawBuffer(nId,iPtr,lastPicNr,"testing");                                         }
</code>

но я хочу использовать указатель на данные изображения и отображать их с помощью OpenCV, потому что мне нужно выполнить обработку пикселей. моя камера CCD моно камера и глубина пикселей составляет 8 бит. Я новичок в OpenCV, есть ли опция в opencv, которая может получить возврат (unsigned char *) Fg_getImagePtrEx (fg, lastPicNr, 0, _memoryAllc); и показать это на экране? или получить данные из указателя iPtr и разрешить мне использовать данные изображения?

да, это правильно. inf
я пытаюсь использовать образец по этой ссылке:opencv.willowgarage.com/wiki/CameraCapture но он продолжает давать мне это сообщение: Ошибка: захват НЕДЕЙСТВИТЕЛЕН, знаете ли вы, как я могу узнать, поддерживает ли opencv мою камеру. ?? user261002
Огромное спасибо. Я собираюсь попробовать это сейчас. user261002
Привет Бэмбун, я не уверен в этом, означает ли это, что если он поддерживает мою камеру, мне не нужно использовать интерфейс framegrabber, и я могу использовать OpenCV напрямую для получения изображений? user261002
Ваша камера не поддерживается или почему вы пытаетесь возиться с указателями? inf

Ваш Ответ

2   ответа
2

я не понимаю, почему вы не делаете это так просто:

Если ваша камера поддерживается, я бы сделал это следующим образом:

   cv::VideoCapture capture(0);

   if(!capture.isOpened()) {
     // print error
     return -1;
   }

   cv::namedWindow("viewer");

   cv::Mat frame;

   while( true )
   {
     capture >> frame;

     // ... processing here

     cv::imshow("viewer", frame);
     int c = cv::waitKey(10);
     if( (char)c == 'c' ) { break; } // press c to quit
   }

Я бы порекомендовал начать читать документы и учебники, которые вы можете найтиВот.

Может быть, его устройство не поддерживается? ;)
@karlphillip, почему он тогда не использует правильный путь? Я просто предполагаю, что проблема имеет совершенно другую природу.
Все просто: OP может не читать файл с диска. Кажется, он захватывает кадры прямо с устройства.
@ karlphillip звучит разумно, мы должны спросить его об этом.
Привет всем, большое спасибо за помощь в решении моей проблемы. Как я уже говорил, я новичок в OpenCV, и я не уверен, поддерживает ли он мою камеру или нет. единственное, что я понимаю, это то, что у меня есть фрейм-граббер, и я использую интерфейс фрейм-граббера, чтобы получить данные с камеры и сохранить их в памяти, теперь вместо использования интерфейса граббера, который не дает мне так много возможностей для Обработка изображений Мне нужно прочитать исходные данные из памяти OpenCV, затем я могу подготовить их к обработке user261002
5

IplImage отunsigned char* raw_data занимает 2 важные инструкции:cvCreateImageHeader() а такжеcvSetData():

// 1 channel for mono camera, and for RGB would be 3
int channels = 1; 
IplImage* cv_image = cvCreateImageHeader(cvSize(width,height), IPL_DEPTH_8U, channels);
if (!cv_image)
{
    // print error, failed to allocate image!
}

cvSetData(cv_image, raw_data, cv_image->widthStep);

cvNamedWindow("win1", CV_WINDOW_AUTOSIZE);
cvShowImage("win1", cv_image);
cvWaitKey(10);

// release resources
cvReleaseImageHeader(&cv_image);
cvDestroyWindow("win1");

Я не тестировал код, но дорожная карта для кода, который вы ищете, есть.

ВАУ, ты ЗВЕЗДА, это сработало, и он показывает изображения из памяти. Еще один вопрос, так как я новичок в openCV, я пытался использовать openCV напрямую, без необходимости использовать фрейм-граббер, я использую камеру Mikrotron CMOS High Speed Camera - Eosens (MC1362), но ни один из простых примеров не работает, У вас есть идея, как я могу использовать OpenCV, подключенный к камере? user261002
Привет, большое спасибо за твой код, я пробую твой код, его сообщение показывает любую ошибку, но на экране он показывает только серое изображение и быстро закрывает окно. Вы знаете, почему он не показывает мои изображения? user261002
В этом случае оставьтеcvNamedWindow() Вызов из цикла. В противном случае он будет создавать новое окно на каждой итерации, и это может вызвать проблемы, в том числе ту, которую вы видите.
Просто на голову, так как мы столкнулись с проблемами с этим примером в нашем проекте робототехники -cv_image->widthStep выровненный размер строки (посмотрите это в документации OpenCV), в то время какcvSetData ожидает фактический размер строки, поэтому в некоторых случаях, когда выровненное значение не совпадает с фактическим размером строки, ваши пиксели будут сдвинуты.
Попробуйте изменить время вcvWaitKey(), Это количество миллисекунд, в течение которых оно будет ожидать нажатия клавиши. Я думаю, что вы можете попробовать пройти0 заставить функцию ждать нажатия клавиши. Кроме того, вы имеете в виду, что оно показывает ваше изображение в оттенках серого или просто полный серый прямоугольник внутри окна? Ваши изображения цветные?!?

Похожие вопросы