我在运行程序时收到错误消息,我特别考虑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轴。
这是错误
我为手机摄像头道歉,但是我正在和另一个城市的其他人一起工作,那里有测试设备(我是编码员),这就是他们寄给我的。
答案 0 :(得分:1)
如错误消息所述,输入到颜色转换功能中的图像具有无效的通道数。
问题是您正在将帧作为单个8位通道获取
Camera.set(cv::CAP_PROP_FORMAT, CV_8UC1)
然后您尝试将该帧转换为灰度
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY)
您有2个简单的方法可以解决此问题:
答案 1 :(得分:0)
您要进行颜色处理,但是图像的类型为CV_8U1。它必须至少是三个通道的图像,例如CV_8UC3或CV_32F。 尝试其他CV_Type
Camera.set(cv::CAP_PROP_FORMAT, CV_32F);