我正在做一个项目,其中涉及获取实时摄像头供稿并将其显示在用户的窗口上。

由于默认情况下摄像机图像是错误的处理方式,因此我使用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);
}

07-24 09:25