我正在做一个项目,其中涉及获取实时摄像头供稿并将其显示在用户的窗口上。
由于默认情况下摄像机图像是错误的处理方式,因此我使用cvFlip对其进行翻转(因此计算机屏幕就像一面镜子),如下所示:
while (true)
{
IplImage currentImage = grabber.grab();
cvFlip(currentImage,currentImage, 1);
// Image then displayed here on the window.
}
在大多数情况下,这都可以正常工作。但是,对于许多用户(大多数是在较快的PC上),相机馈送剧烈闪烁。基本上,显示的是未翻转的图像,然后是一遍又一遍的翻转图像,然后是未翻转的图像。
然后我做了些改动以发现问题...
while (true)
{
IplImage currentImage = grabber.grab();
IplImage flippedImage = null;
cvFlip(currentImage,flippedImage, 1); // l-r = 90_degrees_steps_anti_clockwise
if(flippedImage == null)
{
System.out.println("The flipped image is null");
continue;
}
else
{
System.out.println("The flipped image isn't null");
continue;
}
}
翻转的图像似乎总是返回null。为什么?我究竟做错了什么?这真让我抓狂。
如果这是cvFlip()的问题,还有什么其他方式可以翻转IplImage?
感谢任何帮助!
最佳答案
您需要使用空图像而不是NULL初始化翻转的图像,然后才能将结果存储在其中。同样,您只应创建一次镜像,然后重新使用内存以提高效率。因此,执行此操作的更好方法如下所示(未试用):
IplImage current = null;
IplImage flipped = null;
while (true) {
current = grabber.grab();
// Initialise the flipped image once the source image information
// becomes available for the first time.
if (flipped == null) {
flipped = cvCreateImage(
current.cvSize(), current.depth(), current.nChannels()
);
}
cvFlip(current, flipped, 1);
}