我正在尝试使用 OpenCV 3 在从 Kinect v2 传感器获得的图像上绘制几个圆圈。
cv::circle
似乎有一个奇怪的错误,或者我不明白这个函数是如何工作的。让我们看一些代码:
if(kinectDataManager.IsColorStreamEnabled())
{
cv::Mat colorFrameMat = kinectDataManager.GetFrame().GetColorFrame()
cv::imshow("Color", colorFrameMat)
}
此代码运行良好,使用 ImageWatch Visual Studio 插件检查 OpenCV 图像,我可以看到 colorFrameMat
矩阵没有损坏。
让我们再看一些代码:
if(kinectDataManager.IsColorStreamEnabled())
{
cv::Mat colorFrameMat = kinectDataManager.GetFrame().GetColorFrame()
int radius = 2;
int y = 1068;
for (int x = 0; x < 1920; ++x)
{
cv::circle(colorFrameMat, cv::Point(x,y), radius, cv::Scalar(255, 0, 0), -1, CV_AA);
}
cv::imshow("Color", colorFrameMat)
}
循环执行完成后,ImageWatch 插件显示图像的最后几行丢失了。奇怪的是,程序还在执行。但是,对于不同的 y
值,程序会由于访问冲突而崩溃,例如对于 y = 1067
,程序在 x = 1917
时崩溃。对于 y = 1069
,它会在 x = 988
处崩溃。
有人知道问题出在哪里吗?
编辑: ImageWatch 插件当然会显示最后一行丢失了,因为在这些位置从左到右绘制了圆圈,对错误感到抱歉!!
编辑2:
存储一帧并读入后,具有相同代码的 cv::circle
方法工作正常:
cv::Mat test = cv::imread("test.jpg", CV_LOAD_IMAGE_COLOR);
cv::namedWindow("test", CV_WINDOW_NORMAL);
int radius = 10;
int y = 1067;
for (int x = 0; x < 1920; ++x)
{
cv::circle(test, cv::Point(x, y), radius, cv::Scalar(0, 0, 255, 255), -1, CV_AA);
}
cv::imshow("test", test);
cv::waitKey(0);
最佳答案
Kinect SDK 仅提供读取 4 channel 图像(即 RGBA)的功能,但是,cv::circle
函数似乎以一种奇怪的方式崩溃以处理此类图像。通过调用 cvtImage
删除 alpha channel ,我可以解决这个问题。
关于c++ - cv::circle 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34018514/