cv:circle 函数通过一次调用绘制多个圆
Posted
技术标签:
【中文标题】cv:circle 函数通过一次调用绘制多个圆【英文标题】:cv:circle function draw multiple circles with a single call 【发布时间】:2015-05-27 18:42:24 【问题描述】:我是 OpenCV 库的新手,我想用它来检测从 iPad 后置摄像头捕获的视频流中的圆圈。我想出了如何做到这一点,并且使用 OpenCV 2.4.2,它可以在不到 10 行代码中完成。但这对我不起作用,我认为我错过了一些东西,因为我获得了一些奇怪的行为。
代码非常简单,每次相机捕捉到新帧时,都会在 Objective-C 回调触发器中开始。这是我在这个回调中所做的:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
fromConnection:(AVCaptureConnection *)connection
// Convert CMSampleBufferRef to CVImageBufferRef
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Lock pixel buffer
CVPixelBufferLockBaseAddress(imageBuffer, kCVPixelBufferLock_ReadOnly);
// Construct VideoFrame struct
uint8_t *baseAddress = (uint8_t*)CVPixelBufferGetBaseAddress(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
size_t stride = CVPixelBufferGetBytesPerRow(imageBuffer);
// Unlock pixel buffer
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
std::vector<unsigned char> data(baseAddress, baseAddress + (stride * height));
// Call C++ function with these arguments => (data, (int)width, (int)height)
这是使用 OpenCV 处理图像的 C++ 函数:
void proccessImage(std::vector<unsigned char>& imageData, int width, int height)
// Create cv::Mat from std::vector<unsigned char>
Mat src(width, height, CV_8UC4, const_cast<unsigned char*>(imageData.data()));
Mat final;
// Draw a circle at position (300, 200) with a radius of 30
cv::Point center(300, 200);
circle(src, center, 30.f, CV_RGB(0, 0, 255), 3, 8, 0);
// Convert the gray image to RGBA
cvtColor(src, final, CV_BGRA2RGBA);
// Reform the std::vector from cv::Mat data
std::vector<unsigned char> array;
array.assign((unsigned char*)final.datastart, (unsigned char*)final.dataend);
// Send final image data to GPU and draw it
从 iPad 后置摄像头获取的图像是 BGRA(32 位)格式。
我所期望的是来自 iPad 后置摄像头的图像,在 x = 300px,y = 200px 的位置绘制了一个简单的圆圈,半径为 30px。
这就是我得到的:http://i.stack.imgur.com/bWfwa.jpg
你知道我的代码有什么问题吗?
提前致谢。
【问题讨论】:
【参考方案1】:感谢您的帮助,我终于弄清楚发生了什么,这完全是我的错……
当你创建一个新的 Mat 时,你需要将图像的高度作为第一个参数传递给它,而不是宽度。如果我切换参数,圆圈会正确绘制。
【讨论】:
以上是关于cv:circle 函数通过一次调用绘制多个圆的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 cv2.circle 在 Qlabel 内的图像上绘制一个圆圈