c++ - cv::circle 的奇怪行为

标签 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 插件当然会显示最后一行丢失了,因为在这些位置从左到右绘制了圆圈,对错误感到抱歉!!

编辑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/

相关文章:

c++ - opencv detectMultiScale3 中的 levelWeights 是什么意思?

c++ - 使用大小为 4 的未初始化值

c++ - 如何从 IStream 读取到一个 char 数组并将其写入另一个 IStream?

c++ - 为什么不递增? (构造函数)

c# - 两幅图像之间的差异

c++ - 是否可以制作一个结构节点类型的数组?

c++ - 从 C++ 函数返回指针的推荐方法?

vb.net - 以秒为单位找出两个日期时间之间的差异

python - 使用 OpenCV 对图像进行 mask 和平滑处理

python-2.7 - 在 Python 中使用 Opencv 从图像中减去背景