如何同步每20毫秒更新一次的接收图像?

时间:2014-10-23 11:57:19

标签: c++ opencv boost

我正在使用c ++并使用boost处理异步调用。我有一个main函数,它每20毫秒调用一次图像处理器,并使用OpenCV我试图显示我从另一个程序获得的图像。

主要功能如下:

 void Master::StartControlTimer()
 {
     m_ControlTimer.expires_from_now(boost::posix_time::milliseconds( m_ControlTimerPeriod ));

     m_ControlTimer.async_wait(boost::bind(&Master::OnControlTimerElapsed, this, boost::asio::placeholders::error));
 }

OnControlTimerElapsed调用一个函数,该函数从程序接收图像,我想处理图像,并使用OpenCV显示它:

void ImageProcessor::processImage(unsigned char* image, int resolution[2])
{
  m_OcvImage = cvCreateImage(cvSize(resolution[0], resolution[1]), 8, 3);

  for (unsigned int i = 0; i < resolution[1]; i++){
    for (unsigned int j = 0; j < resolution[0]; j++){
        int r, g, b;
        r = cvRound(255 * image[3 * ((resolution[1] - i)*resolution[0] + j) + 0]);
        g = cvRound(255 * image[3 * ((resolution[1] - i)*resolution[0] + j) + 1]);
        b = cvRound(255 * image[3 * ((resolution[1] - i)*resolution[0] + j) + 2]);

        m_OcvImage.at<cv::Vec3b>(i, j) = cv::Vec3b((uchar)b, (uchar)g, (uchar)r);

    }
  }
  cv::namedWindow("image", cv::WINDOW_AUTOSIZE);
  cv::imshow("image", m_OcvImage);
  m_OcvImage.release();
}

我的问题是这给我一个R6010错误,我认为这是因为它试图写入相同的内存位置,因为每隔20毫秒调用一次processImage。

如何使用boost库同步图像?

我尝试使用:

 boost::mutex::scoped_lock lok(m_ImageMutex)

其中m_ImageMutex是一个boost :: mutex,就在调用cvCreateImage函数之前,但没有运气。

任何有用的想法?

1 个答案:

答案 0 :(得分:1)

  • 坚持使用c ++ api并避免混淆不推荐的c-api调用,例如cvCreateImage,这样就可以了:

    m_OcvImage = Mat(Size(resolution[0], resolution[1]), CV_8UC3);
    
  • cv::namedWindow()电话移至主电话。您不需要为每次拨打processImage()

  • 创建一个新窗口
  • 如果您使用imshow(),则需要进行相应的waitKey()调用(最好是在主线程中)