cv :: circle的奇怪行为

时间:2015-12-01 10:49:11

标签: c++ visual-studio opencv kinect

我正在尝试使用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插件当然会显示最后一行丢失,因为从左到右在这些位置绘制了圆圈,对不起这个错误!!

EDIT2: 存储一帧并将其读入后,具有相同代码的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);

2 个答案:

答案 0 :(得分:2)

Kinect SDK仅提供读取4通道图像(即RGBA)的功能,但cv::circle功能似乎以奇怪的方式对这些图像造成崩溃。通过调用cvtImage来删除Alpha通道,我可以解决问题。

答案 1 :(得分:0)

由于您在cv::circle调用之前说图像看起来很好,GetColorFrame()可能会返回循环运行时更改的数据。 尝试:

  • GetColorFrame().clone()以查看是否可解决此问题,或
  • 改变GetColorFrame的工作方式。