OpenCV、dlib——图像类型转换在函数中失败;在外面工作
OpenCV, dlib - image type conversion failes in a function; works outside
程序逻辑如下:
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
,则程序的第二个版本可以运行。尽管如此,它并没有真正回答问题。
您是否阅读了 dlib::toMat 的文档? :)
dlib::toMat() 的文档是这样说的:
returns 一个 OpenCV Mat 对象,它表示与 img 相同的图像。这个
通过将 Mat 对象设置为指向与 img 相同的内存来完成。
因此,返回的Mat对象只要是指针才有效
img 中的像素保持有效.
程序逻辑如下:
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
,则程序的第二个版本可以运行。尽管如此,它并没有真正回答问题。
您是否阅读了 dlib::toMat 的文档? :)
dlib::toMat() 的文档是这样说的:
returns 一个 OpenCV Mat 对象,它表示与 img 相同的图像。这个 通过将 Mat 对象设置为指向与 img 相同的内存来完成。 因此,返回的Mat对象只要是指针才有效 img 中的像素保持有效.