c++ - 输入图像中的通道数无效
问题描述
我在运行我的程序时收到一个错误,我特别想到了 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 的角度-轴。
这是错误
我为手机摄像头道歉,但我正在与另一个城市的其他人一起工作,他们有测试设备(我是编码员),这就是他们发给我的。
解决方案
如错误消息所述,颜色转换函数输入中给出的图像具有无效的通道数。
关键是您正在以单个 8 位通道的形式获取帧
Camera.set(cv::CAP_PROP_FORMAT, CV_8UC1)
然后您尝试将此帧转换为灰度
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY)
您有 2 个简单的选项来解决此问题:
- 您更改相机采集格式以便在帧中包含颜色信息,例如使用 CV_32S 或 CV_32F
- 您跳过颜色转换,因为您已经有灰度图像,因此无需转换它。
推荐阅读
- flutter - 如何创建不可修改的类 Flutter
- python - Mypy,python 路径,“找不到实现或库存根”
- javascript - 如何在反应中将请求标头从 express 传递到 index.js?
- python - 如何检查用户是否未提供角色?
- javascript - 刷新页面 NODE.js 时用户未保持登录状态
- tree - SML使用reduce和map遍历n叉树
- java - 调整要在热敏打印机上打印的图像尺寸
- javascript - 如何更改页面中所有用户个人资料链接的颜色?
- html - 在 RMarkdown 中创建绘图和编织到 HTML 的功能不起作用
- typescript - 如何为 typescript 编译器 (tsc) 设置默认目标 es 版本?