我正在使用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函数之前,但没有运气。
任何有用的想法?
答案 0 :(得分:1)
坚持使用c ++ api并避免混淆不推荐的c-api调用,例如cvCreateImage
,这样就可以了:
m_OcvImage = Mat(Size(resolution[0], resolution[1]), CV_8UC3);
将cv::namedWindow()
电话移至主电话。您不需要为每次拨打processImage()
如果您使用imshow()
,则需要进行相应的waitKey()
调用(最好是在主线程中)