OpenCV库在捕获视频流时会给出不满意的链接错误。
opencv 3.2.0库应该放在哪里?opencv类的包的正确路径是什么?
生成此错误的代码位置:
package opencv;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.videoio.VideoCapture;
public class 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();
}
}例外情况是:
Exception in thread "main" java.lang.UnsatisfiedLinkError:
no opencv_java320 in 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)发布于 2019-05-27 13:04:37
尝试克隆以下存储库:
https://github.com/hellonico/opencv4_java_tutorial.git
将您的类添加到java文件夹中,而不是使用System.loadLibrary ...使用:
NativeLoader.loadLibrary(Core.NATIVE_LIBRARY_NAME);这将加载一个正确编译的OpenCV版本,以便在JVM中运行。
发布于 2019-05-27 13:57:10
下图是我在opencv 4.0.1安装了tesseract库的目录中的内容。我是在Windows10上用mingw32的gcc编译器构建的。

我想你至少有两个文件opencv_javaXXX_dll和opencv-XXX.jar.
我已经在Windows10上用mingw32构建了opencv库,所以我必须设置mingw32安装的bin目录和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(三)J
我认为这将是一个复杂的问题。
你可以从头开始编译和构建你的库。
在windows操作系统上,我必须在CMakefile.txt中的以下行添加一个构建标志。
我添加了一个'--add-stdcall-alias‘标志。
CMakefile.txt的位置:
~opencv-4.1.0源directory\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://stackoverflow.com/questions/49581404
复制相似问题