我将带有外部dll的相机加载到我的OpenCV程序中。我可以看到框架cv::imshow("edges", frame);
,一切正常。 frame.channels()
给了我3个频道,但是当我尝试cv::cvtColor(frame, gray, CV_BGR2GRAY);
应用程序崩溃时。
CreateImage(System::Byte *imgData, int height, int width,int show)
{
frame = cv::Mat(height, width, CV_8UC3, imgData);
if (show > 0)
cv::imshow("edges", frame); //I can see myself
return frame.channels(); //three channels
}
void ConvertAndProcess()
{
cv::Mat gray;
cv::cvtColor(frame, gray, CV_BGR2GRAY); //crash...
//do something
}
我已经挖了一段时间但没有结果。我做错了什么?
答案 0 :(得分:5)
frame = cv::Mat(height, width, CV_8UC3, imgData);
这是一个'借来的'指针。当imgData离开作用域时(在函数末尾),frame.data无效。
这意味着,如果你以这种方式构造它,你不能指望frame在ConvertAndProcess()中有效。
你可以克隆()它,以实现“深层复制”:
frame = cv::Mat(height, width, CV_8UC3, imgData).clone();
答案 1 :(得分:2)
如果void ConvertAndProcess()
包含某些内容,请检入frame
。似乎frame
是空的,因此没有什么可以从BGR转换为灰色。
您可以执行以下操作:
if(!frame.empty())
cvtColor(frame, gray, CV_BGR2GRAY);
else
{
cout<<"\nFrame is empty.";
return;
}