Как правильно отображать копии изображений, снятых OpenCV VideoCapture? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь использовать класс OpenCV VideoCapture для последовательного чтения изображений из определенной папки, как показано в приведенном ниже коде, который извлекается из https://www.kevinhughes.ca/tutorials/reading-image-sequences-with-opencv. Чтение работает очень хорошо, и я могу просматривать потоковое видеоиз прочитанных изображений (imgSrc) правильно. Проблема возникает, когда я пытаюсь скопировать каждый кадр в новый объект Mat, используя вложенные циклы for, новое изображение (imgDst) отличается от исходного. Я приложил результаты кадра ниже. Что-то я делаю не так, чтобы получить этот странный результат?

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

void help(char** argv)
{
cout << "\nThis program gets you started reading a sequence of images using cv::VideoCapture.\n"
     << "Image sequences are a common way to distribute video data sets for computer vision.\n"
     << "Usage: " << argv[0] << " <path to the first image in the sequence>\n"
     << "example: " << argv[0] << " right%%02d.jpg\n"
     << "q,Q,esc -- quit\n"
     << "\tThis is a starter sample, to get you up and going in a copy paste fashion\n"
     << endl;
}

int main(int argc, char** argv)
{
if(argc != 2)
{
  help(argv);
  return 1;
}

string arg = argv[1];
VideoCapture sequence(arg);
if (!sequence.isOpened())
{
  cerr << "Failed to open Image Sequence!\n" << endl;
  return 1;
}

Mat imgSrc; // source image
for(;;)
{
  sequence >> imgSrc;

if(imgSrc.empty())
  {
      cout << "End of Sequence" << endl;
      break;
  }
  Mat imgDst = cv::Mat::zeros(cv::Size(imgSrc.size().width,imgSrc.size().height),CV_16U);


  // Copying the elements of imgSrc to imgDst
  uint16_t* imgSrcPtr;
  uint16_t* imgDstPtr;
  for(int i = 0; i < imgSrc.rows; i++)
  {
      imgDstPtr = imgDst.ptr<uint16_t>(i);
      imgSrcPtr = imgSrc.ptr<uint16_t>(i);

       for(int j= 0; j < imgSrc.cols; j++)
       imgDstPtr[j] = imgSrcPtr[j];
  }

  namedWindow("Source image ",WINDOW_AUTOSIZE );

  namedWindow("Destination image ",WINDOW_AUTOSIZE );
  imshow("Destination image ", imgDst);
  waitKey(0;

return 0;
}

Source image Destination image

1 Ответ

0 голосов
/ 31 октября 2019

Используя метод image.type (), я обнаружил, что класс VideoCapture преобразует считываемые кадры в оттенках серого CV_16U в формат CV_8UC3 (RGB24), поэтому простое преобразование цветового пространства в оттенки серого решило проблему.

...