- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从其上传文件中裁剪1x1员工图片,以将其设置为我的Grails应用程序上的头像。我听说OpenCV做得很好,所以我在ImageService
中使用了它。问题在于,它似乎无法找到(或读取)所需的CascadeClassifier
XML文件:
class ImageService {
final String FRONTAL_FACE_XML = "D:\\Devtools\\opencv\\build\\etc\\lbpcascades\\lbpcascade_frontalface_improved.xml"
final String ORIGINAL_PICTURE = "D:\\Projects\\opencv\\grails-app\\assets\\4fc30smaegvq0z3mvgm9yhf6vtv9kv8bgryi9x08wuada8jxu3.jpg"
final String CROPPED_PICTURE = "D:\\Projects\\opencv\\grails-app\\assets\\4fc30smaegvq0z3mvgm9yhf6vtv9kv8bgryi9x08wuada8jxu3_100.jpg"
void opencvtest() {
// Before I placed the OpenCV dll in the environment path, this line causes an error.
System.loadLibrary(Core.NATIVE_LIBRARY_NAME)
// UnsatisfiedLinkError here
CascadeClassifier faceDetector = new CascadeClassifier(this.getClass().getResource("lbpcascade_frontalface_improved.xml").getPath());
// Same error as well.
// File cascadeFile = new File(FRONTAL_FACE_XML);
// CascadeClassifier faceDetector = new CascadeClassifier(cascadeFile.getAbsolutePath());
// And also here.
// CascadeClassifier faceDetector = new CascadeClassifier(FRONTAL_FACE_XML);
Mat image = HighGui.imread(ORIGINAL_PICTURE)
faceDetector.detectMultiScale(image, face_Detections)
Rect rect_Crop = null
for (Rect rect : face_Detections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0))
rectCrop = new Rect(rect.x, rect.y, rect.width, rect.height)
}
Mat image_roi = new Mat(image, rectCrop)
HighGui.imwrite(CROPPED_PICTURE, image_roi)
return
}
}
java.lang.UnsatisfiedLinkError org.opencv.objdetect.CascadeClassifier.CascadeClassifier_0(Ljava/lang/String;)J
D:\opencv\4.0.1
上解压缩了它们的发行版。 D:\opencv\4.0.1\build\java\x64
jar
上找到的D:\opencv\4.0.1\build\java
复制到了grails lib
目录中。 dll
和xml
复制到C:\Windows\system32
。 jar
可能是“错误的”,我通过compile "org.bytedeco.javacpp-presets:opencv:4.0.1-1.4.4"
将此包替换为BuildConfig.groovy
上的包,但仍然会在同一行上引起错误。 FRONTAL_FACE_XML
和ORIGINAL_PICTURE
是否都是正确的文件路径,并且它们都是正确的。 最佳答案
在此示例中,我们将在Windows上使用在VC15上使用OpenCV。我还没有学习如何在Linux上移植它。
传说:
APPLICATION_PATH = D:\application
JAVA_DLL_PATH = D:\opencv\4.0.1\build\java\x64
VC_DLL_PATH = D:\opencv\4.0.1\build\x64\vc15\bin
%VC_DLL_PATH%
目录。 debug
(或您喜欢的名称)的目录,然后将所有*d.dll
文件移到该目录中。这些以*d.dll
结尾的文件在运行它们时可能会导致错误,因为它正在查找不属于基本Visual C++ 2015的vc15调试dll
。%APPLICATION_PATH%\src
目录中创建一个名为files
的目录(或任何您喜欢的目录)。它应该与此类似。
%APPLICATION_PATH%
├── bin\
├── grails-app\
├── lib\
├── ...
├── src\
│ ├── groovy\
│ ├── java\
│ └── files\ --new directory
└── ...
*.dll
和%JAVA_DLL_PATH%
目录中的所有%VC_DLL_PATH%
复制到新创建的目录%APPLICATION_PATH%\src\files
中。 .classpath
文件中。
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry excluding="spring/" kind="src" path="grails-app/conf"/>
...
<classpathentry kind="src" path="src/files"/>
...
</classpath>
%APPLICATION_PATH%
中创建另一个名为files
的目录(或您喜欢的任何一个)。
%APPLICATION_PATH%
├── bin\
├── grails-app\
├── files\ --new directory
└── ...
CascadeClassifiers
xml文件。它们位于\opencv\4.0.1\build\etc
目录中。 dll
复制到%APPLICATION_PATH%
中,我们仍然需要将它们包括在系统路径中。编辑您的环境变量,并将%JAVA_DLL_PATH%
和%VC_DLL_PATH%
目录包括到PATH
中。 dll
并将库目录包含在系统路径中,我们仍然需要将其包含在Tomcat JVM库路径中。打开BuildConfig.groovy
并添加以下内容:
grails.tomcat.jvmArgs = ["-Djava.library.path=D:\opencv\4.0.1\build\x64\vc15\bin;D:\opencv\4.0.1\build\java\x64"]
Config.groovy
中。
openCV {
cascadeClassifiers = "D:\\application\\files\\opencv"
home = "D:\\opencv\\4.0.1\\build\\x64\\vc15\\bin"
java = "D:\\opencv\\4.0.1\\build\\java\\x64"
}
*.java
中创建一个
*.groovy
文件而不是
%APPLICATION_PATH%\src\java
文件。我还没有检查为什么在
.groovy
文件上不起作用。
import grails.util.Holders;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.UUID;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.FileUtils;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;
public class ImageService {
static final String[] OPENCV_SUPPORTED_EXTENSION = new String[]{"bmp", "dib", "jp2", "jpe", "jpeg", "jpg", "pbm", "pgm", "png", "ppm", "ras", "sr", "tif", "tiff"};
public static File cropImage(final File originalFile) {
loadLibrary();
return cropImage(originalFile, originalFile.getParentFile(), getCascadeClassifiers());
}
public static File cropImage(final File originalFile, final ArrayList<CascadeClassifier> cascadeClassifiers) {
return cropImage(originalFile, originalFile.getParentFile(), cascadeClassifiers);
}
public static File cropImage(final File originalFile, final File targetDirectory) {
loadLibrary();
return cropImage(originalFile, originalFile.getParentFile(), getCascadeClassifiers());
}
public static File cropImage(final File originalFile, final File targetDirectory, final ArrayList<CascadeClassifier> cascadeClassifiers) {
ArrayList<File> siblingFiles = getFaces(originalFile, cascadeClassifiers);
File maxFile = null;
int maxWidth = 0;
for(int x = 0; x < siblingFiles.size(); x++) {
Mat image = Imgcodecs.imread(siblingFiles.get(x).getAbsolutePath(), Imgcodecs.IMREAD_UNCHANGED);
if(image.width() > maxWidth) {
maxFile = siblingFiles.get(x);
maxWidth = image.width();
}
}
File croppedFile = null;
if(maxFile != null) {
croppedFile = new File(targetDirectory.getAbsolutePath() +
File.separator +
originalFile.getName());
try {
FileUtils.copyFile(maxFile, croppedFile);
}
catch(IOException e) {}
}
for(int y = 0; y < siblingFiles.size(); y++) {
siblingFiles.get(y).delete();
}
System.gc();
System.runFinalization();
return croppedFile;
}
public static ArrayList<CascadeClassifier> getCascadeClassifiers() {
ArrayList<CascadeClassifier> classifiers = new ArrayList<CascadeClassifier>();
final String[] cascadeSupportedExtensions = new String[]{"xml"};
final String cascadeClassifierPath = Holders.getFlatConfig().get("openCV.cascadeClassifiers").toString();
File cascadeClassifierDirectory = new File(cascadeClassifierPath);
ArrayList<File> detectors = new ArrayList<File>(FileUtils.listFiles(cascadeClassifierDirectory, cascadeSupportedExtensions, false));
for(int y = 0; y < detectors.size(); y++) {
CascadeClassifier faceDetector = new CascadeClassifier();
faceDetector.load(detectors.get(y).getAbsolutePath());
classifiers.add(faceDetector);
}
return classifiers;
}
public static ArrayList<File> getFaces(final File originalFile) {
loadLibrary();
return getFaces(originalFile, getCascadeClassifiers());
}
public static ArrayList<File> getFaces(final File originalFile, final ArrayList<CascadeClassifier> cascadeClassifiers) {
File temporaryFile = new File(originalFile.getParentFile().getAbsolutePath() +
File.separator +
UUID.randomUUID().toString() +
"." + FilenameUtils.getExtension(originalFile.getName()));
try {
FileUtils.copyFile(originalFile, temporaryFile);
}
catch(IOException e) {}
final int frame = 9;
final int offset = 8;
int rotateCounter = 0;
Integer marginX, marginY, marginWidth, marginHeight;
Integer pxPerOffset, excess;
ArrayList<File> siblingFiles = new ArrayList<File>();
while(rotateCounter < 4) {
if(rotateCounter > 0) {
Mat image = Imgcodecs.imread(temporaryFile.getAbsolutePath(), Imgcodecs.IMREAD_UNCHANGED);
Core.transpose(image, image);
Core.flip(image, image, 1);
Imgcodecs.imwrite(temporaryFile.getAbsolutePath(), image);
image.release();
}
for(int y = 0; y < cascadeClassifiers.size(); y++) {
CascadeClassifier faceDetector = cascadeClassifiers.get(y);
Mat image = Imgcodecs.imread(temporaryFile.getAbsolutePath(), Imgcodecs.IMREAD_UNCHANGED);
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
Rect defaultRect = null;
Rect marginRect = null;
Rect[] facesRect = faceDetections.toArray();
for(int z = 0; z < facesRect.length; z++) {
defaultRect = facesRect[z];
pxPerOffset = defaultRect.width / frame;
marginX = defaultRect.x - (pxPerOffset * offset);
marginY = defaultRect.y - (pxPerOffset * offset);
marginWidth = defaultRect.width + (offset * pxPerOffset * 2);
marginHeight = defaultRect.height + (offset * pxPerOffset * 2);
excess = Math.max(
0 - marginX,
Math.max(0 - marginY,
Math.max(marginX + marginWidth - image.width(),
Math.max(marginY + marginHeight - image.height(), 0)))
);
if(excess > 0) {
marginX += excess;
marginY += excess;
marginWidth -= excess * 2;
marginHeight -= excess * 2;
}
marginRect = new Rect(marginX, marginY, marginWidth, marginHeight);
Mat imageWithMargin = new Mat(image, marginRect);
String croppedFileName = temporaryFile.getParentFile().getAbsolutePath() +
File.separator +
UUID.randomUUID().toString() + "_" +
y + "_" +
rotateCounter + "_" +
z + "." +
FilenameUtils.getExtension(temporaryFile.getName());
Imgcodecs.imwrite(croppedFileName, imageWithMargin);
siblingFiles.add(new File(croppedFileName));
imageWithMargin.release();
}
image.release();
}
rotateCounter++;
}
temporaryFile.delete();
return siblingFiles;
}
public static void loadLibrary() {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
final String[] urls = new String[]{
Holders.getFlatConfig().get("openCV.java").toString(),
Holders.getFlatConfig().get("openCV.home").toString()
};
final String[] validExtensions = new String[]{"dll"};
ArrayList<File> dlls = new ArrayList<File>();
for(int y = 0; y < urls.length; y++) {
dlls.addAll(FileUtils.listFiles(new File(urls[y]), validExtensions, false));
}
for(int y = 0; y < dlls.size(); y++) {
for(int z = 0; z < validExtensions.length; z++) {
System.loadLibrary(dlls.get(y).getName().replace("." + validExtensions[z], ""));
System.load(dlls.get(y).getAbsolutePath());
}
}
}
}
class TestService {
def openCVTest() {
File picture = new File("D:\\original.jpg");
File savingDirectory = new File("D:\\");
ImageService.cropImage(picture, savingDirectory);
return;
}
}
关于java - 无法在Grails 2.4.4项目中实例化OpenCV-4.0.1 CascadeClassifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54723222/
我是 python 的新手。我试图找到我的文本的频率分布。这是代码, import nltk nltk.download() import os os.getcwd() text_file=open(
我对安卓 fragment 感到困惑。我知道内存 fragment 但无法理解什么是 android fragment 问题。虽然我发现很多定义,比如 Android fragmentation re
尝试对 WordPress 进行 dockerise 我发现了这个场景: 2个数据卷容器,一个用于数据库(bbdd),另一个用于wordpress文件(wordpress): sudo docker
这个问题已经有答案了: From the server is there a way to know that my page is being loaded in an Iframe (1 个回答)
我正在玩小型服务器,试图对运行在其上的服务进行docker化。为简化起见,假设我必须主要处理:Wordpress和另一项服务。 在Docker集线器上有许多用于Wordpress的图像,但是它们似乎都
我想要发生的是,当帐户成功创建后,提交的表单应该消失,并且应该出现一条消息(取决于注册的状态)。 如果成功,他们应该会看到一个简单的“谢谢。请检查您的电子邮件。” 如果不是,那么他们应该会看到一条适当
就是这样,我需要为客户添加一个唯一标识符。通过 strip 元数据。这就是我现在完全构建它的方式,但是我只有最后一部分告诉我用户购买了哪个包。 我试着看这里: Plans to stripe 代码在这
我有一个类将执行一些复杂的操作,涉及像这样的一些计算: public class ComplexAction { public void someAction(String parameter
这个问题已经有答案了: maven add a local classes directory to module's classpath (1 个回答) 已关闭10 年前。 我有一些不应更改的旧 E
我使用 fragment 已经有一段时间了,但我经常遇到一个让我烦恼的问题。 fragment 有时会相互吸引。现在,我设法为此隔离了一个用例,它是这样的: Add fragment A(也使用 ad
我的 html 中有一个 ol 列表,上面有行条纹。看起来行条纹是从数字后面开始的。有没有办法让行条纹从数字开始? 我已经包含了正在发生的事情的片段 h4:nth-child(even) {
如何仅使用 css 将附加图像 html 化? 如果用纯 css 做不到,那我怎么能至少用一个图像来做 最佳答案 这不是真正的问题,而是您希望我们为您编写代码。我建议您搜索“css breadcrum
以下是 Joshua 的 Effective Java 的摘录: If you do synchronize your class internally, you can use various te
在这里工作时,我们有一个框向业务合作伙伴提供 XML 提要。对我们的提要的请求是通过指定查询字符串参数和值来定制的。其中一些参数是必需的,但很多不是。 例如,我们要求所有请求都指定一个 GUID 来标
我有 3 个缓冲区,其中包含在 32 位处理器上运行的 R、G、B 位数据。 我需要按以下方式组合三个字节: R[0] = 0b r1r2r3r4r5r6r7r8 G[0] = 0b g1g2g3g4
我最近发现了关于如何使用 History.js、jQuery 和 ScrollTo 通过 HTML5 History API 对网站进行 Ajax 化的要点:https://github.com/br
我们有一个 Spring Boot 应用程序,由于集成需要,它变得越来越复杂——比如在你这样做之后发送一封电子邮件,或者在你之后广播一条 jms 消息等等。在寻找一些更高级别的抽象时,我遇到了 apa
我正在尝试首次实施Google Pay。我面临如何指定gateway和gatewayMarchantId的挑战。 我所拥有的是google console帐户,不知道在哪里可以找到此信息。 priva
昨天下午 3 点左右,我为两个想要从一个 Azure 帐户转移到另一个帐户的网站设置了 awverify 记录。到当天结束时,Azure 仍然不允许我添加域,所以我赌了一把,将域和 www 子域重新指
我正在使用terms facet在elasticsearch服务器中获取顶级terms。现在,我的标签"indian-government"不被视为一个标签。将其视为"indian" "governm
我是一名优秀的程序员,十分优秀!