cv::circle的怪异行为
Weird behaviour of cv::circle
我正试图用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通道图像(即RGBA)的功能,然而,对于这类图像,cv::circle
功能似乎以一种奇怪的方式崩溃。通过调用cvtImage
来丢弃alpha通道,我可以解决这个问题。
由于您说图像在cv::circle
调用之前看起来很好,因此GetColorFrame()
可能会返回在循环运行时更改的数据。尝试:
GetColorFrame().clone()
,看看这是否解决了问题,或者- 改变CCD_ 14的工作方式
相关文章:
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 概念中的cv限定符需要表达式参数列表
- 编写代码时C++出现错误:错误 1 错误 C2601:'circle':本地函数定义是非法的
- 将CHW格式的浮点向量转换为cv::Mat
- 错误的cv::face FacemarkLBF实例化
- 如何检查给定的参数是否为 cv::noArray()?
- 开放 CV 中的动态内存分配,用于视频处理
- 如何在 opencv 中使用 cv::VideoCapture::waitAny()
- 错误:未定义对cv::cudacodec::createVideoReader的引用
- OpenCV 3.4.1 error readNetFromTensorflow 无法在 cv::d nn::ReadProtoFromBinaryFile 中打开 .pb
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- Inference pytorch C++ with alexnet and cv::imread image
- OpenCV 3.4.3 中对 'cv::String::d eallocate()' 错误的未定义引用
- cv::Normalise() 中的 L2_NORM 和 NORM_MINMAX 实现有什么区别?
- 将 cv::Mat 转换为 std::vector 的通用函数
- OpenCV undefined reference to 'cv::imread(cv::String const&, int)'
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- cv::circle的怪异行为