我正在尝试使用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);
答案 0 :(得分:2)
Kinect SDK仅提供读取4通道图像(即RGBA)的功能,但cv::circle
功能似乎以奇怪的方式对这些图像造成崩溃。通过调用cvtImage
来删除Alpha通道,我可以解决问题。
答案 1 :(得分:0)
由于您在cv::circle
调用之前说图像看起来很好,GetColorFrame()
可能会返回循环运行时更改的数据。
尝试:
GetColorFrame().clone()
以查看是否可解决此问题,或GetColorFrame
的工作方式。