解決 OpenCV 編譯後不定時崩潰、失效等問題

 

這邊提供 OpenCV 編譯後崩潰的可能解決方法:

我的環境是 OpenCV 4.5.4、Ubuntu 22.04,

並使用 g++ 11.4.0 編譯我的專案。


我遇到的情境問題是,我得到一包 C/C++ 的專案,

裡面用 Makefile 來整合編譯專案,裡面包含我自己寫的一段高斯濾波程式碼。

這貨整包編譯時沒有出錯;

獨立把高斯濾波程式碼放到另一個編譯、運行也都沒有出錯。


但當我在源碼裡面運行這段高斯濾波程式碼時"有機率"會出錯:

    int ksize = 3;
    cv::Size size = image.size();
    int width = size.width;
    int height = size.height;
    cv::Mat blurred_image(height, width, CV_8UC1, cv::Scalar::all(0));
    cv::GaussianBlur(grey, blurred_image, cv::Size(ksize, ksize), 0, 0);


然而我給定的高斯核大小為 3x3,

非常奇怪,程式會跳說高斯核定義不是奇數,所以不合法:

error: (-215:Assertion failed) ksize.width > 0 && ksize.width % 2 == 1 && 
ksize.height > 0 && ksize.height % 2 == 1 in function 'createGaussianKernels'


除此之外,當我想使用旋轉圖片、在圖片上畫點的功能也全部失效,但是編譯又沒有出錯,

這件事情真的是非常奇怪。


因為是運行時錯誤,於是我先用 GDB 檢查了函式是否重複定義:



然而並沒有,這就奇了怪了。


後來我開始埋 log 想辦法抓鬼,也完全抓不到。



解決方法:

把專案的 Makefile 打開,有關於 OpenCV 的部份改寫,

讓 Makefile 繞過 pkg-config ,手動給定 OpenCV.hpp 還有 libopencv_XXX.so 的路徑。


如果我的 OpenCV.hpp 放在 /usr/include/opencv4/opencv2 底下,

那就把 CFLAGS+= 裡面加入 -I/usr/include/opencv4;

libopencv_XXX.so 放在 /usr/lib/x86_64-linux-gnu 下面,

那就把 LDFLAGS += 裡面加入 -L/usr/lib/x86_64-linux-gnu。


原版:

ifeq ($(OPENCV), 1) 
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv4`
COMMON+= `pkg-config --cflags opencv4`
endif


改寫成:

ifeq ($(OPENCV), 1) 
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV -I/usr/include/opencv4
LDFLAGS+= `pkg-config --libs opencv4` 
LDFLAGS+= -L/usr/lib/x86_64-linux-gnu -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs
COMMON+= `pkg-config --cflags opencv4`
endif


完美解決



雖然我另外一份獨立的 CPP 檔案能夠用 pkg 找到 OpenCV 也能編譯,

pkg PATH 裡面也有 OpenCV,暫時不知道哪裡耦合到了,

先留紀錄改天遇到再來深究。


若有錯誤請聯絡我 - wuyiulin@gmail.com



留言

這個網誌中的熱門文章

[心得] 破解 Google 雲端下載限制(非建立副本)