输入图像中的通道数无效

Ded*_*nis 12 c++ opencv raspberry-pi

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

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

我正在做的项目将相机指向一个暗盒的中心,有一个移动的光点。

我在 Raspberry Pi 3 以及raspicam库上使用 OpenCV 4.0.0 和 C++ 。

我从指南中获取指导,但我使用的是 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);
Run Code Online (Sandbox Code Playgroud)

我期望程序取一帧视频源,将其转换为灰度,找到该帧最亮的部分,最后做一些计算,从正 x 找到到帧中心的距离和点的角度-轴。

这是错误

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

Mau*_*rni 7

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

关键是您正在获取帧作为单个 8 位通道

Camera.set(cv::CAP_PROP_FORMAT, CV_8UC1)
Run Code Online (Sandbox Code Playgroud)

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

cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY)
Run Code Online (Sandbox Code Playgroud)

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

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

查看此链接以了解 OpenCV 颜色操作