输入图像中的通道数无效

时间:2019-06-07 05:21:55

标签: c++ opencv raspberry-pi

我在运行程序时收到错误消息,我特别考虑OpenCV库中的颜色操作。

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

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

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

我从this指南中获取了指针,但是我使用的是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 个答案:

答案 0 :(得分:1)

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

问题是您正在将帧作为单个8位通道获取

Camera.set(cv::CAP_PROP_FORMAT, CV_8UC1)

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

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

您有2个简单的方法可以解决此问题:

  1. 您更改骆驼采集格式以使其具有颜色 帧中的所有信息,例如使用CV_32S或CV_32F
  2. 您已经具有灰度图像,因此可以跳过颜色转换,因此无需进行转换。

Take a look to this link for OpenCV color manipulation

答案 1 :(得分:0)

您要进行颜色处理,但是图像的类型为CV_8U1。它必须至少是三个通道的图像,例如CV_8UC3或CV_32F。 尝试其他CV_Type

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