0

我已经彻底搜索了论坛,除非我在搜索字符串中遗漏了某些关键字,所以如果我错过了一个帖子,请原谅我。我目前正在使用 OpenCV 2.4.0,我认为这只是一个简单的问题:

我正在尝试接收从另一个 API 获得的无符号字符数组(8 位,3 通道)并将其放入 OpenCV 矩阵中以查看它。然而,所显示的只是尺寸正确但灰色完全一致的图像。这与您指定要显示的不正确的 Mat 名称时看到的颜色相同。

已咨询: 将字节字符串转换为 cv::mat(使用数组内部的字符串)和 opencv 从相机数据创建垫子(我认为是宾果游戏!,但似乎无法正确显示图像) .

我退后一步,只是尝试制作一个示例数组(以消除提供此数组的其他部分):

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 中的某些内容以使其正确显示?一如既往地感谢大家的帮助!

4

1 回答 1

3

这里所有的巫术都归结为调用getchar()而不是(必需的)waitKey()

让我解释一下,waitKey 在这里可能用词不当,但您实际上需要它,因为里面的代码包装了窗口的消息循环,它触发了实际的 blitting(除了等待按键)。

如果您不调用它,您的窗口将永远不会更新,并且只会保持灰色(这就是您在此处观察到的)

确实,您应该相信 cout 的结果,您的 Mat 构造正确,只是没有出现在 namedWindow 中

(顺便说一句,getchar() 等待来自控制台窗口的按键,而不是你的 img 窗口)

希望对您有所帮助,祝您继续愉快地进行黑客攻击;)

于 2013-10-17T18:59:13.430 回答