OpenCV Android SDK 中 Imgproc.Canny() 對應兩個 native 方法 Canny_0、Canny_1,開發者常困惑如何在 Eclipse/Android Studio 中跳轉至 C++ 實作。本文說明 JNI 呼叫鏈、opencv/sources/modules 目錄結構、以及三種查看源碼的實用路徑。
// Java 包裝 (opencv/modules/java/generator/cpp/Imgproc.cpp 生成)
public static void Canny(Mat image, Mat edges, double threshold1, double threshold2) {
Canny_1(image.nativeObj, edges.nativeObj, threshold1, threshold2);
}
public static void Canny(Mat image, Mat edges, double threshold1, double threshold2,
int apertureSize, boolean L2gradient) {
Canny_0(image.nativeObj, edges.nativeObj, threshold1, threshold2, apertureSize, L2gradient);
}
// Native 宣告
private static native void Canny_0(long image_nativeObj, long edges_nativeObj,
double threshold1, double threshold2,
int apertureSize, boolean L2gradient);
private static native void Canny_1(long image_nativeObj, long edges_nativeObj,
double threshold1, double threshold2);
opencv-4.x.x-src.zip。opencv/modules/imgproc/src/canny.cppopencv/modules/java/generator/cpp/Imgproc.cpp (自動生成)opencv/modules/java/CMakeLists.txtEclipse: 1. 右鍵專案 → Properties → Java Build Path → Libraries 2. 展開 opencv-xxx.jar → Source attachment → Edit 3. 指向 opencv/sources 目錄 (或 modules/java 源碼目錄) Android Studio: 1. File → Project Structure → Modules → Dependencies 2. 找到 opencv 模組 → 編輯 Source JAR/目錄路徑
注意:OpenCV Android SDK 預編譯 AAR/JAR 通常不包含 C++ 源碼,僅含 Java 包裝層。需手動關聯完整源碼目錄才能跳轉至 canny.cpp。
image.type() == CV_8UC1 (單通道 8 位)。Sobel(src, dx, CV_16S, 1, 0, apertureSize)、Sobel(src, dy, CV_16S, 0, 1, apertureSize)。magnitude(dx, dy, mag)、phase(dx, dy, angle) (若 L2gradient 用 L2 範數)。threshold1 (低)、threshold2 (高),滯後閾值演算法連接強/弱邊緣。edges.setTo(255, strong_edges)。| 問題 | 答案 |
|---|---|
| 為何有 Canny_0 和 Canny_1? | 對應 Java 端兩個重載:含/不含 apertureSize、L2gradient 參數。 |
| Eclipse 跳轉只能看到 Java 包裝層? | 因為 AAR 內未打包 C++ 源碼,需關聯外部 sources 目錄。 |
| 如何修改 Canny 演算法? | 修改 canny.cpp 後需重新編譯 OpenCV 原生庫 (.so),並替換專案中的 jniLibs。 |
| 官方文件在哪裡? | https://docs.opencv.org/ 搜尋 Canny,含完整參數說明與範例。 |
OpenCV Android 版 Canny 透過 JNI 呼叫 modules/imgproc/src/canny.cpp 核心實作。查看源碼最直接方式是瀏覽 GitHub 線上倉庫或下載完整源碼關聯至 IDE。理解 Java 包裝層 → JNI 橋接層 → C++ 核心層 三層架構,有助於深度除錯、效能調優與演算法客製化。