我想我已经彻底搜索了论坛,除非我在搜索字符串中遗漏了某些关键字,所以如果我错过了帖子,请原谅我。我目前正在使用OpenCV 2.4.0,我认为这只是一个简单的问题:
我试图接受一个无符号字符数组(8位,3通道),我从另一个API获取并将其放入OpenCV矩阵然后查看它。但是,所有显示的都是正确尺寸但完全均匀灰色的图像。这与您指定要显示的不正确的Mat名称时看到的颜色相同。
咨询过: Convert a string of bytes to cv::mat(使用数组中的字符串)和 opencv create mat from camera data(我以为是BINGO!,但似乎无法正确显示图像)。
我退后一步,尝试制作一个样本数组(以消除提供此数组的其他部分):
int main() {
bool isCamera = true;
unsigned char image_data[] = {255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255,0,0,255};
cv::Mat image_as_mat(Size(6,3),CV_8UC3,image_data);
namedWindow("DisplayVector2",CV_WINDOW_AUTOSIZE);
imshow("DisplayVector2",image_as_mat);
cout << image_as_mat << endl;
getchar();
}
所以我只是创建一个6x3矩阵,第一行是红色像素,第二行是绿色像素,第三行是蓝色。然而,这仍然会产生相同的空白灰度图像,但尺寸正确。
矩阵的输出是(注意分号,即它正确格式化):
[255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0; 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0; 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 255]
我可能会疯狂或遗漏一些明显的东西。我是否需要在Mat中初始化某些内容以使其正确显示?非常感谢所有人的帮助!
答案 0 :(得分:2)
所有伏都教归结为调用getchar()
而不是(必需的)waitKey()
让我解释一下,waitKey可能在这里用词不当,但实际上你需要它,因为里面的代码包装了窗口的messageloop,它触发了实际的blitting(除了等待按键)。
如果你不打电话,你的窗口永远不会更新,并且会保持灰色(这就是你在这里观察到的)
实际上,你应该相信cout的结果,你的Mat得到了正确构造,它只是没有出现在namedWindow中(btw,getchar()等待来自控制台窗口的按键,而不是你的img窗口)
希望它有所帮助,快乐的黑客攻击;)