【发布时间】:2016-06-11 21:09:54
【问题描述】:
程序的逻辑如下:
using namespace dlib;
int main()
{
while (flag)
{
cv::Mat3b frame0;
camera0 >> frame0;
cv::imshow("Video0", frame0);
array2d<rgb_pixel> img;
assign_image(img, cv_image<bgr_pixel>(frame0));
cv::imshow("Video0_processed", toMat(img));
...
}
...
}
而且效果很好。
当我把它改成
cv::Mat3b convert_back_and_forth(cv::Mat3b cv_img);
int main()
{
while (flag)
{
cv::Mat3b frame0;
camera0 >> frame0;
cv::imshow("Video0", frame0);
cv::imshow("Video0_processed", convert_back_and_forth(frame0));
...
}
...
}
cv::Mat3b convert_back_and_forth(cv::Mat3b cv_img)
{
array2d<rgb_pixel> img;
assign_image(img, cv_image<bgr_pixel>(cv_img));
return toMat(img);
}
它崩溃没有任何错误。程序简单地终止。
一个版本
cv::Mat3b convert_back_and_forth(cv::Mat3b cv_img);
int main()
{
cv::Mat3b frame0;
while (flag)
{
camera0 >> frame0;
cv::imshow("Video0", frame0);
...
}
cv::imshow("Video0_processed", convert_back_and_forth(frame0));
...
}
cv::Mat3b convert_back_and_forth(cv::Mat3b cv_img)
{
array2d<rgb_pixel> img;
assign_image(img, cv_image<bgr_pixel>(cv_img));
return toMat(img);
}
有效。但当然功能是不一样的。第一版和第二版有什么区别?为什么初始可能工作而后者失败?
编辑:
我刚刚发现,如果我在全局范围内声明 array2d<rgb_pixel> img,则程序的第二个版本可以工作。然而,它并没有真正回答这个问题。
【问题讨论】:
-
顺便说一句,声明
cv::Matoutside 循环的变量是更好的做事方式。这只是效率问题。在第一次迭代之后,变量将“指向”一个内存块,其大小由第一个捕获的帧指定。每次连续迭代都会覆盖内存中该位置的数据,而不是创建新的数据,这正是在循环中创建变量时会发生的情况。