问题遇到的现象和发生背景
java使用Opencv在main能运行但是在Control下就报错
opencv版本为4.5.4
问题相关代码,请勿粘贴截图
@RequestMapping("Openmv")
@ResponseBody
public void Openmv(HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("开始");
// System.setProperty("spring.devtools.restart.enabled", "false");
// System.out.println(System.getProperty("java.library.path"));
// // 加载动态库
// URL url = ClassLoader.getSystemResource("lib/opencv/opencv_java454.all");
// System.load(url.getPath());
// System.out.println(url);
// System.load(url1);
// System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
System.load("D:\\down\\opencv\\build\\java\\x64\\opencv_java454.dll");
System.out.println("人脸检测开始……");
//读取原图像
Mat image =Imgcodecs.imread("D:\\down\\worklace\\CV\\aaa.jpg");
//建立灰度图像存储空间
Mat gray = new Mat(image.rows(), image.cols(), CvType.CV_8UC1);
//彩色图像灰度化
Imgproc.cvtColor(image, gray, Imgproc.COLOR_RGB2GRAY);
//高斯模糊
Mat gauss = gray.clone();
Imgproc.GaussianBlur(gray, gauss, new Size(new Point(5, 5)), 0);
// 函数检测边缘
Mat canny = gauss.clone();
Imgproc.Canny(gauss, canny, 100, 200);
//找到轮廓
Mat hierarchy = canny.clone();
List<MatOfPoint> contours = new ArrayList<>();
Imgproc.findContours(canny, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
List<Integer> ints = new ArrayList<>();
List<MatOfPoint> points = new ArrayList<>();
//从轮廓的拓扑结构信息中得到有5层以上嵌套的轮廓
for (int i = 0; i < contours.size(); i++) {
int k = i;
int c = 0;
while (hierarchy.get(0, k)[2] != -1) {
k = (int) hierarchy.get(0, k)[2];
c = c + 1;
if (c >= 5) {
ints.add(i);
points.add(contours.get(i));
}
}
}
System.out.println("找到" + ints.size() + "个标志轮廓!");
Point[] points1 = points.get(0).toArray();
Point[] points2 = points.get(1).toArray();
Point[] points3 = points.get(2).toArray();
Point[] point = new Point[points1.length + points2.length + points3.length];
System.arraycopy(points1, 0, point, 0, points1.length);
System.arraycopy(points2, 0, point, points1.length, points2.length);
System.arraycopy(points3, 0, point, points1.length + points2.length, points3.length);
//轮廓转换成最小矩形包围盒
RotatedRect rotatedRect = Imgproc.minAreaRect(new MatOfPoint2f(point));
//截取出二维码
Rect qrRect = rotatedRect.boundingRect();
Mat mat = new Mat(image, qrRect);
String flag="0";
//扫描后的图片
Mat hsv_image = new Mat(mat.size(), mat.type());
Mat mat2=new Mat(mat.size(), mat.type());
//将图片的格式转为HSV模式,原来为RGB
Imgproc.cvtColor(mat, hsv_image, Imgproc.COLOR_BGR2HSV);
// 色调(H),饱和度(S),明度(V)
// 下面就可以进行颜色的提取了
int num=0;
int num_rows = hsv_image.rows();
int num_col = hsv_image.cols();
for (int i = 0; i < num_rows; i++) {
for (int j = 0; j < num_col; j++) {
// 获取每个像素
double[] clone = hsv_image.get(i, j).clone();
double hun = clone[0]; // HSV hun
if ((hun>=35&&hun<=77)) {
if (clone[1] >= 43 && clone[1] <= 255) {
if (clone[2] >= 46 && clone[2] <= 255) {
// 红色范围外,全部设置为黑色,
/*clone[0] = 0;
clone[1] = 0;
clone[2] = 255;*/
num++;
flag="1";
//mat2.put(i, j, clone);
}
}
}
}
}
if(flag.equals("1")){
System.out.println("绿码");
}
// System.out.println(num);
//保存图像到Result目录中
// Imgcodecs.imwrite("D:\\down\\worklace\\opencv\\gray.png",mat2);
// Imgcodecs.imwrite("D:\\down\\worklace\\opencv\\qrCodeImg.jpg", qrCodeImg);
}
运行结果及报错内容
Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/opencv/imgcodecs/Imgcodecs
我的解答思路和尝试过的方法
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);报错Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: org/opencv/core/Core
project structure->Libraries->java已配置,Vm option也配置了,没有引用spring-boot-devtools