使用OpenCV中应当注意的几个问题

xiaoxiao2021-02-28  89

本文主要总结在工程项目中使用OpenCV库时候遇到的问题,并进行总结。

1、警惕浅拷贝

浅拷贝对于图像来说不是好事吗?减少了内存的开销。代码没那么笨重。但是分情况!!

Mat img_a = imread("test.jpg"); Mat img_b = img_a; //这是浅拷贝 /* 也就是说改变了 img_b 会同时影响到 img_a; */

也许很多人会说:这没啥呀。但是下面这种情况最坑。

//先定义一个函数 void func(const Mat & image_in, const int & a ){ /* do something ...*/ cv::Mat test_image = image_in; Rect roi(x,y,width,height); rectangle(test_image, roi, cv::Scalar(255,255,255)); // ① √ rectangle(image_in, roi, cv::Scalar(255,255,255)); // ② × } // 解释一下,②为什么错,便宜时候会发现:“No matching function for call to 'rectangle'” // 为然后就发现 candidate 有两个, 但都不合适,其原因是 :如果输入为image_in 那么第一个参数会失去其 // 常量的性质。“1st argument (const cv::Mat) would lost const qualifier”. // 而我们①的test_image 却不是const ,就可以通过编译。但是实际上这不就是指针的不安全的地方吗? // 起到了釜底抽薪的作用。最终还是可以通过别的方式改变了const Mat。 // 但这是不合适的:因为我们用const就是为了绝对不会改变其值。 // 这是最坑爹的地方。已经给opencv的官方发了信息。希望能修改源代码。

怎么进行深拷贝

img.copyTo(img1) // ① img1=img.clone() // ② 建议第二种

2、OpenCV GPU版本

2.1 ocl版本

! OPENCV warning: getUMat()/getMat() call chain possible problem. ! Base object is dead, while nested/derived object is still alive or processed. ! Please check lifetime of UMat/Mat objects!

这个问题主要是由于我们在循环中调用了getUmat(), 不要再循环中调用。例如imread(**).getUMat(cv::ACCESS_READ)

2.2

3、OpenCV多线程imshow

这是一个巨大的坑,多线程不可以使用imshow,情况就是闪退,即使你用了waitKey,namedWindow。这时候我们可以使用imwrite()来进行调试。官方的说法是:imshow\waitKey只能用在主线程main thread.

转载请注明原文地址: https://www.6miu.com/read-1950140.html

最新回复(0)