Неверное количество каналов во входном изображении - PullRequest
1 голос
/ 07 июня 2019

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

Я пытаюсь создать программу, которая берет видео с камеры Raspberry Pi и анализируетЭто.Я хочу найти самую яркую точку в видео и вычислить расстояние и угол, под которым эта точка находится от центра видеопотока.

В проекте, который я делаю, камера направлена ​​в центр темной рамкис движущейся точкой света.

Я использую OpenCV 4.0.0 и C ++ на Raspberry Pi 3, а также библиотеку raspicam .

Явзяв указатели из этого руководства, но я использую C ++ и видеопоток вместо Python и статическое изображение.

    raspicam::RaspiCam_Cv Camera;
    cv::Mat image;
    cv::Mat gray;
    int nCount=100;
    int nR, nC;         // numRows, numCols
    cv::Point imgMid;
    Vect toCenter;

    // for recording brightest part of img
    double minVal, maxVal;
    cv::Point minLoc, maxLoc;

    Camera.set(cv::CAP_PROP_FORMAT, CV_8UC1);

    #ifdef DEBUG
    cout << "Opening camera..." << endl;
    if (!Camera.open()) {
        cerr << "Error opening the camera" << endl;
        return -1;
    }
    cout << "Capturing " << nCount << " frames ...." << endl;
    #endif

    for (int i=0; i< nCount; i++) {
        Camera.grab();
        Camera.retrieve(image);
        nR = image.rows;
        nC = image.cols;
        imgMid.x = nC / 2;
        imgMid.y = nR / 2;

        // convert to grayscale image
        cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);

        // find x, y coord of brightest part of img
        cv::minMaxLoc(gray, &minVal, &maxVal, &minLoc, &maxLoc);

        // calculate vector to the center of the camera
        toCenter.first = distBtwn(imgMid.x, maxLoc.x, imgMid.y, maxLoc.y);
        toCenter.second = angle(imgMid.x, maxLoc.x, imgMid.y, maxLoc.y);

Я ожидаю, что программа возьмет кадр из видеопотокапреобразуйте его в оттенки серого, найдите самую яркую часть кадра и, наконец, выполните некоторые вычисления, чтобы найти расстояние до центра кадра и угол точки от положительной оси x.

Этоошибка

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

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Как сказано в сообщении об ошибке, изображение, переданное на вход функции преобразования цветов, имеет недопустимое количество каналов.

Дело в том, что вы получаете кадры как один 8-битный канал

Camera.set(cv::CAP_PROP_FORMAT, CV_8UC1)

и затем вы пытаетесь преобразовать этот кадр в оттенки серого

cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY)

У вас есть 2 простых варианта решения этой проблемы:

  1. вы меняете формат получения камеры, чтобы получить цвет информация в ваших кадрах, например, с использованием CV_32S или CV_32F
  2. вы пропускаете преобразование цветов, поскольку у вас уже есть изображение в градациях серого, поэтому преобразовывать его не нужно.

Посмотрите эту ссылку для манипулирования цветом OpenCV

0 голосов
/ 07 июня 2019

Вы хотите сделать манипулирование цветом, но ваше изображение имеет тип CV_8U1. Это должен быть как минимум трехканальный образ, такой как CV_8UC3 или CV_32F. Попробуйте другой CV_Type

Camera.set(cv::CAP_PROP_FORMAT, CV_32F);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...