Java-программирование, opencv неудовлетворенная ошибка связи
Исключение в потоке "main" java.lang.UnsatisfiedLinkError: нет opencv_java320 в java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at opencv.VideoCap.main(VideoCap.java:9)
код, где генерировать эту ошибку
пакет opencv;
import org.opencv.core. *;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
открытый класс VideoCap
{
public static void main (String args[]){
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // error
VideoCapture camera = new VideoCapture(0);
if(!camera.isOpened()){
System.out.println("Error");
}
else {
Mat frame = new Mat();
while(true){
if (camera.read(frame)){
System.out.println("Frame Obtained");
System.out.println("Captured Frame Width " +
frame.width() + " Height " + frame.height());
Imgcodecs.imwrite("camera.jpg", frame);
System.out.println("OK");
break;
}
}
}
camera.release();
}}
0 ответов
Следующая картинка - мое содержимое каталога, в котором opencv 4.0.1 установлен с библиотекой tesseract. Я построил его с помощью компилятора gcc mingw32 на Windows на самом деле 10.
Я думаю, что у вас есть как минимум два файла opencv_javaXXX_dll и opencv-XXX.jar.
Я собрал библиотеку opencv с компилятором gcc mingw32 в Windows 10 Итак, я должен установить каталог bin, где установлен mingw32 и java.
Я устанавливаю переменные в окне cmd,
SET MINGW_HOME=D:/DEV/SDK/msys32/mingw32
SET JAVA_HOME=D:/DEV/SDK/JDK/jdk1.8.0_152
SET PATH=%MINGW_HOME%/bin;%JAVA_HOME%/bin
Вот мои тестовые команды.
C:\Windows\System32\cmd.exe /C "javac -cp .;opencv-410.jar -d . *.java & java -Djava.library.path=. -cp .;opencv-410.jar VideoCap"
Есть три возможных случая.
1. Не удается найти зависимую библиотеку.
Эта проблема указывает на то, что у вас отсутствуют некоторые библиотеки.
В этом случае я должен получить это сообщение, если у меня нет libtesseract40.dll в том же каталоге или системном пути.
2. Неудовлетворительная ошибка связи с именем библиотеки.
Обычно это происходит, когда имя библиотеки не совпадает. Я получу ошибку, если у меня есть libopencv_java410.dll в качестве имени библиотеки.
3. Неудовлетворительная ошибка связи с именем метода.
Если у вас есть еще одна неудовлетворенная ссылка - имя метода.
Например,
java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_eye (III) J
Я думаю это усложнит проблему.
Возможно, ваша библиотека будет скомпилирована и собрана с нуля.
В ОС Windows мне пришлось добавить флаг сборки на следующей строке в CMakefile.txt.
Я добавил флаг '--add-stdcall-alias'.
Расположение файла CMakefile.txt:
[~ opencv-4.1.0 исходный каталог]\modules\java\jni\CMakefile.txt
elseif(((CV_GCC OR CV_CLANG OR UNIX) OR (OPENCV_FORCE_FAT_JAVA_LIB_LD_RULES)) AND (NOT OPENCV_SKIP_FAT_JAVA_LIB_LD_RULES))
ocv_target_link_libraries(${the_module} LINK_PRIVATE -Wl,-whole-archive ${__deps} -Wl,-no-whole-archive -Wl,--add-stdcall-alias)
Полный код теста выглядит следующим образом:
//A test code for the opencv 4.0.1
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
public class HelloCV {
public static void test1(){
System.load(new java.io.File(".").getAbsolutePath() + java.io.File.separator + "opencv_java410.dll");
VideoCapture camera = new VideoCapture(0);
if(!camera.isOpened()){
System.out.println("Error");
}
else {
Mat frame = new Mat();
while(true){
if (camera.read(frame)){
System.out.println("Frame Obtained");
System.out.println("Captured Frame Width " +
frame.width() + " Height " + frame.height());
Imgcodecs.imwrite("camera.jpg", frame);
System.out.println("OK");
break;
}
}
}
camera.release();
}
public static void test2(){
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // error
VideoCapture camera = new VideoCapture(0);
if(!camera.isOpened()){
System.out.println("Error");
}
else {
Mat frame = new Mat();
while(true){
if (camera.read(frame)){
System.out.println("Frame Obtained");
System.out.println("Captured Frame Width " +
frame.width() + " Height " + frame.height());
Imgcodecs.imwrite("camera.jpg", frame);
System.out.println("OK");
break;
}
}
}
camera.release();
}
public static void main (String args[]){
test1();
test2();
}
}
Попробуйте клонировать репозиторий ниже:
https://github.com/hellonico/opencv4_java_tutorial.git
Добавьте свой класс в папку java и вместо System.loadLibrary ... используйте:
NativeLoader.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Это загрузит правильно скомпилированную версию OpenCV для запуска в JVM.