首页 > 解决方案 > 输入图像中的通道数无效

问题描述

我在运行我的程序时收到一个错误,我特别想到了 OpenCV 库中的颜色操作。

我正在尝试构建一个程序,该程序从 Raspberry Pi 相机获取视频并对其进行分析。我想找到视频中最亮的点并计算该点与视频源中心的距离和角度。

我正在做的项目是将相机对准一个暗盒的中心,并带有一个移动的光点。

我在 Raspberry Pi 3 上使用 OpenCV 4.0.0 和 C++,以及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 的角度-轴。

这是错误

我为手机摄像头道歉,但我正在与另一个城市的其他人一起工作,他们有测试设备(我是编码员),这就是他们发给我的。

标签: c++opencvraspberry-pi

解决方案


如错误消息所述,颜色转换函数输入中给出的图像具有无效的通道数。

关键是您正在以单个 8 位通道的形式获取帧

Camera.set(cv::CAP_PROP_FORMAT, CV_8UC1)

然后您尝试将此帧转换为灰度

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

您有 2 个简单的选项来解决此问题:

  1. 您更改相机采集格式以便在帧中包含颜色信息,例如使用 CV_32S 或 CV_32F
  2. 您跳过颜色转换,因为您已经有灰度图像,因此无需转换它。

查看此链接以进行 OpenCV 颜色操作


推荐阅读