我想从我的网络摄像头捕获单个图像并将其保存到磁盘.我想用Java或Python(最好是Java)来做这件事.我想要一些适用于64位Win7和32位Linux的东西.
编辑:我使用Python 3.x,而不是2.x.
因为在其他任何地方我都看到这个问题让人们感到困惑,我将明确陈述一些事情:
EDIT2:我能够使用Python 2.7和pygame 1.9.1让Froyo的pygame示例在Linux上运行.pygame.camera.camera_list()调用不起作用,但对于示例的其余部分则没有必要.但是,我不得不调用cam.set_controls()(你可以在这里找到http://www.pygame.org/docs/ref/camera.html的文档)来提高亮度,这样我才真正看到了我捕获的图像.
此外,我需要调用cam.get_image()和pygame.image.save()方法三次,然后我认为第一对调用的图像实际上被保存了.他们似乎陷入了一个奇怪的缓冲区.基本上,我不是一次调用cam.get_image(),而是每次想要捕获图像时都要调用它三次.然后我才调用pygame.image.save().
不幸的是,如下所述,pygame.camera仅在Linux上受支持.我仍然没有Windows的解决方案.
我有一个问题,在黑色硬币内填充白洞,以便我只能有0-255二进制图像与填充黑色硬币..我使用中位数过滤器来完成它但在那种情况下硬币之间的连接桥增长,这是不可能的经过几次侵蚀后识别它们......所以我需要在opencv中使用简单的floodFill方法
这是我带孔的图片:
编辑:类似函数的floodfill必须填充大组件中的空洞而不提示X,Y坐标作为种子......
编辑:我试图使用cvDrawContours函数,但我没有在更大的内部填充轮廓.
这是我的代码:
CvMemStorage mem = cvCreateMemStorage(0);
CvSeq contours = new CvSeq();
CvSeq ptr = new CvSeq();
int sizeofCvContour = Loader.sizeof(CvContour.class);
cvThreshold(gray, gray, 150, 255, CV_THRESH_BINARY_INV);
int numOfContours = cvFindContours(gray, mem, contours, sizeofCvContour, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
System.out.println("The num of contours: "+numOfContours); //prints 87, ok
Random rand = new Random();
for (ptr = contours; ptr != null; ptr = ptr.h_next()) {
Color randomColor = new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
CvScalar color = CV_RGB( randomColor.getRed(), randomColor.getGreen(), randomColor.getBlue());
cvDrawContours(gray, ptr, color, color, …
Run Code Online (Sandbox Code Playgroud) 我正在努力学习JavaCV.众所周知,缺乏关于这一主题的教育材料是一个非常大的问题.在JavCV主页中,他们为"OpenCV CookBook"一书中的C++示例提供了大量示例.但情况是,他们不是Java,他们在SCALA !!!! 现在我已经疯了!我知道很多例子都在网上,但我想从头开始学习它,然后我才能正确地做到."OpenCV CookBook"是一本非常好的书,但它完全是关于C++中的OpenCV,而不是关于Java的.
有人请帮我找个更好的学习JavaCV的地方.提供我,URL,书籍等等.但它必须是在100%Java中学习JavaCV,而不是在Scala,C++,C或其他任何语言中学习!请帮忙!
我正在开发一个用于人脸识别的Android应用程序,使用JavaCV,它是OpenCV的非官方包装器.导入后com.googlecode.javacv.cpp.opencv_contrib.FaceRecognizer
,我应用并测试以下已知方法:
在我识别出检测到的脸部之前,我会校正旋转的脸部并裁剪出适当的区域,从而激发了这种方法
一般情况下,当我传递相机时,数据库中已存在一个面,识别就可以了.但这并不总是正确的.有时它很有可能识别未知面部(在训练样本的数据库中找不到).当我们在DB中有两个或更多相似特征的面孔(胡须,小胡子,眼镜......)时,这些面孔之间的识别可能会非常错误!
要使用测试面部图像预测结果,我应用以下代码:
public String predict(Mat m) {
int n[] = new int[1];
double p[] = new double[1];
IplImage ipl = MatToIplImage(m,WIDTH, HEIGHT);
faceRecognizer.predict(ipl, n, p);
if (n[0]!=-1)
mProb=(int)p[0];
else
mProb=-1;
if (n[0] != -1)
return labelsFile.get(n[0]);
else
return "Unkown";
}
Run Code Online (Sandbox Code Playgroud)
我无法控制概率p的阈值,因为:
同样,我不明白为什么在使用LBPH时,为什么predict()函数有时会出现大于100的概率?在Fisher和Eigen的情况下,它给出了非常大的值(> 2000)?? 有人可以帮助找到这些奇怪问题的解决方案吗?是否有任何建议可以提高认可的稳健性?特别是在两个不同面孔相似的情况下.
以下是使用Facerecognizer的整个类:
package org.opencv.javacv.facerecognition;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_contrib.*;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter; …
Run Code Online (Sandbox Code Playgroud) 我在StackOverflow中经历了很多问题,能够开发小程序来正确检测正方形和矩形.这是我的示例代码
public static CvSeq findSquares(final IplImage src, CvMemStorage storage) {
CvSeq squares = new CvContour();
squares = cvCreateSeq(0, sizeof(CvContour.class), sizeof(CvSeq.class), storage);
IplImage pyr = null, timg = null, gray = null, tgray;
timg = cvCloneImage(src);
CvSize sz = cvSize(src.width(), src.height());
tgray = cvCreateImage(sz, src.depth(), 1);
gray = cvCreateImage(sz, src.depth(), 1);
// cvCvtColor(gray, src, 1);
pyr = cvCreateImage(cvSize(sz.width() / 2, sz.height() / 2), src.depth(), src.nChannels());
// down-scale and upscale the image to filter out the noise
// cvPyrDown(timg, pyr, CV_GAUSSIAN_5x5);
// …
Run Code Online (Sandbox Code Playgroud) 我只是想知道在使用JavaCV而不是OpenCV的C/C++实现时,在给定的一组机器上是否会有相对显着的速度性能优势.
如果我错了,请纠正我,但我的理解是opencv的c/c ++实现更接近于机器,因为OpenCV的Java实现,JavaC,将具有轻微的速度性能劣势(以毫秒为单位),因为将源代码转换为字节码的虚拟机,然后转换为机器代码.然而,使用c/c ++,它会直接转换为机器代码,因此不会承载虚拟机开销的中间步骤.
如果我犯了错误,请不要在这里杀了我; 我只是在学习,并欢迎建设性的批评.
谢谢
遇到一些问题,在我的mac上运行一段代码.有人给我写了一个图像分析java应用程序,但我试图在netbeans上运行它时不断收到此错误.
run:线程"main"中的异常java.lang.UnsatisfiedLinkError:在java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)的java.library.path中没有opencv_java249,位于java.lang.Runtime.loadLibrary0(Runtime.java: 870)在java.lang.System.loadLibrary(System.java:1119)at image.prossing.Test.main(Test.java:28)Java结果:1 BUILD SUCCESSFUL(总时间:0秒)
有netbeans项目,并添加必要的jar文件作为库.程序员告诉我下载正确的OpenCV版本并将opencv.dll文件复制到我的java/jre/bin文件夹中.但我找不到dll文件或java/jre文件夹.我知道大多数编程都出现在Windows上是有原因的.希望有人可以帮我解决这个问题并在我的mac上运行这个应用程序.
这是代码的第一部分,最有可能创建错误的部分:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package image.prossing;
/**
*
* @author Dumith Salinda
*/
import java.util.ArrayList;
import java.util.List;
import org.opencv.core.Core;
import static org.opencv.core.Core.FONT_HERSHEY_SIMPLEX;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
public class Test {
public static void main(String[] …
Run Code Online (Sandbox Code Playgroud) 我正在使用JavaCV FFmpegFrameRecorder类将Android的相机预览帧编码为视频.
目标是复制以下命令行的结果:
ffmpeg -i input.mp4 -metadata:s:v:0 rotate="90" output.mp4
Run Code Online (Sandbox Code Playgroud)
我修改了startUnsafe()
如下方法,但无法生成所需的输出:
if ((video_st = avformat_new_stream(oc, video_codec)) != null) {
video_c = video_st.codec();
video_c.codec_id(oformat.video_codec());
video_c.codec_type(AVMEDIA_TYPE_VIDEO);
...
AVDictionary avDictionary = new AVDictionary(null);
av_dict_set(avDictionary, "rotate", "90", 0);
video_st.metadata(avDictionaty);
...
}
...
avformat_write_header(oc, (PointerPointer) null);
Run Code Online (Sandbox Code Playgroud)
这仍然可以正确编码视频,但添加的元数据永远不会出现在ffprobe上.如果有帮助,视频编码为h264.
顺便说一句,这是ffprobe输出:
ffprobe version 2.3.3 Copyright (c) 2007-2014 the FFmpeg developers
built on Jan 22 2015 18:22:57 with Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
configuration: --prefix=/usr/local/Cellar/ffmpeg/2.3.3 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-avresample --enable-vda …
Run Code Online (Sandbox Code Playgroud) 我想制作我的自定义媒体播放器并需要视频的方向信息(用于检测它是从前置或后置摄像头录制的).对于jpeg图像我可以使用,ExifInterface.TAG_ORIENTATION
但对于视频如何我可以找到这些信息.
我试图从视频文件中获取帧并将其转换为jpeg但是它总是0
在所有情况下提供方向.
请帮我.提前致谢.
我正在尝试将JavaCV与Android Studio和Gradle一起使用.我写了这样的代码片段:
repositories {
mavenCentral()
maven {
url "http://maven2.javacv.googlecode.com/git/"
}
}
dependencies {
compile files('libs/android-support-v4.jar')
compile group: 'com.googlecode.javacpp', name: 'javacpp', version: '0.5'
compile group: 'com.googlecode.javacv', name: 'javacv', version: '0.5'
}
Run Code Online (Sandbox Code Playgroud)
我在dir外部库中看到了导入的库.所以我试着运行这个:
...
IplImage zdjecie=cvLoadImage(Environment.getExternalStorageDirectory().getPath()+ "/1.bmp");
cvSaveImage(Environment.getExternalStorageDirectory().getPath()
+ "/2.bmp", zdjecie);
...
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
Caused by: java.lang.UnsatisfiedLinkError: Couldn't load jniopencv_core: findLibrary returned null
Run Code Online (Sandbox Code Playgroud)
...因为我不知道我应该怎么处理opencv(和其他人).so文件.
那么我们应该如何在Android Studio中使用JavaCV?