- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现使用 JavaCv Surf 的示例。我下载了示例代码、.jar 文件并安装了官方网页要求的所有内容 (http://code.google.com/p/javacv/)。但似乎缺少一个函数:cvExtractSURF()无论我做什么,我都无法让 Netbeans 或 Eclipse 编译该示例。也许我做错了什么,或者函数可能有一个新名称或其他一些参数。这是我的错误代码的快照
import com.googlecode.javacv.cpp.opencv_core;
import com.googlecode.javacv.cpp.opencv_core.CvMemStorage;
import com.googlecode.javacv.cpp.opencv_core.CvSeq;
import com.googlecode.javacv.cpp.opencv_core.CvSeqReader;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import com.googlecode.javacv.cpp.opencv_features2d.*;
import com.googlecode.javacv.cpp.opencv_imgproc;
import com.googlecode.javacv.cpp.opencv_imgproc.CvChainPtReader;
import com.googlecode.javacv.cpp.opencv_legacy.CvSURFParams;
import com.googlecode.javacv.cpp.opencv_legacy.CvSURFPoint;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.MappedByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
public class SurftDetection {
public static Hashtable<Point2D,Point2D> detectSurfPts(BufferedImage object, BufferedImage image) {
IplImage firstFrame = IplImage.createFrom(object);
IplImage secondFrame = IplImage.createFrom(image);
CvSeq objectKeypoints = new CvSeq(null);
CvSeq objectDescriptors = new CvSeq(null);
CvSeq imageKeypoints = new CvSeq(null);
CvSeq imageDescriptors = new CvSeq(null);
CvSURFParams params = new CvSURFParams();
params.extended(1).hessianThreshold(500).nOctaves(3).nOctaveLayers(4);
IplImage firstFramegray = opencv_core.cvCreateImage(opencv_core.cvSize(firstFrame.width(),firstFrame.height()), opencv_core.IPL_DEPTH_8U, 1);
opencv_imgproc.cvCvtColor(firstFrame, firstFramegray,opencv_imgproc.CV_BGR2GRAY);
IplImage secondFramecolor = opencv_core.cvCreateImage(opencv_core.cvGetSize(secondFrame), opencv_core.IPL_DEPTH_8U, 1);
opencv_imgproc.cvCvtColor(secondFrame, secondFramecolor,opencv_imgproc.CV_BGR2GRAY);
// convert images to grayscale
// compute surf
CvMemStorage storage1 = CvMemStorage.create();
opencv_core.cvClearMemStorage(storage1);
cvExtractSURF(firstFramegray, null, objectKeypoints, objectDescriptors, storage1, params, 0);
CvMemStorage storage2 = CvMemStorage.create();
opencv_core.cvClearMemStorage(storage2);
cvExtractSURF(secondFramecolor, null, imageKeypoints, imageDescriptors, storage2, params, 0);
return findPairs(objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors);
}
private static double compareSURFDescriptors(FloatBuffer d1, FloatBuffer d2, double best) {
double totalCost = 0;
assert (d1.capacity() == d2.capacity() && d1.capacity() % 4 == 0);
for (int i = 0; i < d1.capacity(); i += 4 ) {
double t0 = d1.get(i ) - d2.get(i );
double t1 = d1.get(i+1) - d2.get(i+1);
double t2 = d1.get(i+2) - d2.get(i+2);
double t3 = d1.get(i+3) - d2.get(i+3);
totalCost += t0*t0 + t1*t1 + t2*t2 + t3*t3;
if (totalCost > best)
break;
}
return totalCost;
}
private static int naiveNearestNeighbor(FloatBuffer vec, int laplacian,
CvSURFPoint[] modelKeypoints, FloatBuffer[] modelDescriptors) {
int neighbor = -1;
double d, dist1 = 1e6, dist2 = 1e6;
for (int i = 0; i < modelDescriptors.length; i++) {
CvSURFPoint kp = modelKeypoints[i];
FloatBuffer mvec = modelDescriptors[i];
if (laplacian != kp.laplacian()) {
continue;
}
d = compareSURFDescriptors(vec, mvec, dist2);
if (d < dist1) {
dist2 = dist1;
dist1 = d;
neighbor = i;
} else if (d < dist2) {
dist2 = d;
}
}
if (dist1 < 0.6 * dist2) {
return neighbor;
}
return -1;
}
private static ArrayList<Integer> findPairs(CvSURFPoint[] objectKeypoints, FloatBuffer[] objectDescriptors,
CvSURFPoint[] imageKeypoints, FloatBuffer[] imageDescriptors) {
ArrayList<Integer> ptpairs = new ArrayList<Integer>(2 * objectDescriptors.length);
for (int i = 0; i < objectDescriptors.length; i++) {
CvSURFPoint kp = objectKeypoints[i];
FloatBuffer descriptor = objectDescriptors[i];
int nearestNeighbor = naiveNearestNeighbor(descriptor, kp.laplacian(), imageKeypoints, imageDescriptors);
if (nearestNeighbor >= 0) {
ptpairs.add(i);
ptpairs.add(nearestNeighbor);
}
}
return ptpairs;
}
private static Hashtable<Point2D,Point2D> findPairs(CvSeq objectKeypoints, CvSeq objectDescriptors, CvSeq imageKeypoints, CvSeq imageDescriptors) {
//CvSeqReader reader = new CvSeqReader(), kreader = new CvSeqReader();
// copy object info
int total = objectDescriptors.total();
int elem_size = objectDescriptors.elem_size();
// opencv_core.cvStartReadSeq(objectKeypoints, kreader, total);
// opencv_core.cvStartReadSeq(objectDescriptors, reader, elem_size);
CvSURFPoint[] objectKeypointsArr = new CvSURFPoint[total];
FloatBuffer[] objectDescriptorsArr = new FloatBuffer[total];
for (int i = 0; i < total; i++) {
// objectKeypointsArr[i] = new opencv_features2d.CvSURFPoint(kreader.ptr());
// objectDescriptorsArr[i] = reader.ptr().capacity(elem_size).asByteBuffer().asFloatBuffer();
objectKeypointsArr[i] = new CvSURFPoint(opencv_core.cvGetSeqElem(objectKeypoints, i));
objectDescriptorsArr[i] = opencv_core.cvGetSeqElem(objectDescriptors,i).capacity(elem_size).asByteBuffer().asFloatBuffer();
// opencv_core.CV_NEXT_SEQ_ELEM(kreader.seq().elem_size(), kreader);
// opencv_core.CV_NEXT_SEQ_ELEM(reader.seq().elem_size(), reader);
}
total = imageDescriptors.total();
elem_size = imageDescriptors.elem_size();
CvSURFPoint[] imageKeypointsArr = new CvSURFPoint[total];
FloatBuffer[] imageDescriptorsArr = new FloatBuffer[total];
// opencv_core.cvStartReadSeq(imageKeypoints, kreader, 0);
// opencv_core.cvStartReadSeq(imageDescriptors, reader, 0);
for (int i = 0; i < total; i++) {
imageKeypointsArr[i] = new CvSURFPoint(opencv_core.cvGetSeqElem(imageKeypoints, i));
imageDescriptorsArr[i] = opencv_core.cvGetSeqElem(imageDescriptors,i).capacity(elem_size).asByteBuffer().asFloatBuffer();
// opencv_core.CV_NEXT_SEQ_ELEM(kreader.seq().elem_size(), kreader);
// opencv_core.CV_NEXT_SEQ_ELEM(reader.seq().elem_size(), reader);
}
ArrayList<Integer> pairs = findPairs(objectKeypointsArr,objectDescriptorsArr,imageKeypointsArr,imageDescriptorsArr);
Hashtable<Point2D,Point2D> map = new Hashtable<Point2D, Point2D>(pairs.size());
for(int i=0;i<pairs.size();i+=2){
map.put(new Point2D.Float(objectKeypointsArr[pairs.get(i)].pt().x(), objectKeypointsArr[pairs.get(i)].pt().y()),
new Point2D.Float(imageKeypointsArr[pairs.get(i+1)].pt().x(), imageKeypointsArr[pairs.get(i+1)].pt().y()));
}
return map;
}
public static BufferedImage resizeImage(BufferedImage im, int new_Width, int new_height){
IplImage cv_im = IplImage.createFrom(im);
IplImage cv_res = IplImage.create(new_Width, new_height, cv_im.depth(), cv_im.nChannels());
opencv_imgproc.cvResize(cv_im, cv_res);
return cv_res.getBufferedImage();
}
public static IplImage resizeImage(IplImage cv_im, int new_Width, int new_height){
IplImage cv_res = IplImage.create(new_Width, new_height, cv_im.depth(), cv_im.nChannels());
opencv_imgproc.cvResize(cv_im, cv_res);
return cv_res;
}
}
最佳答案
尝试导入
import static com.googlecode.javacv.cpp.opencv_legacy.cvExtractSURF;
或更一般的
import static com.googlecode.javacv.cpp.opencv_legacy.*;
关于javacv cvExtractSURF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14524612/
尝试使用 JAVACV 库从网络摄像头捕获。但它会抛出一个 UnsatisfiedLinkError。堆栈轨迹如下: Exception in thread "main" java.lang.Unsa
尝试使用 JavaCV 进行图像处理以根据其 Exif 数据旋转图像。从文件读取和写入 Mat 或 IplImage 是可行的,但由于正在上传或下载文件,我也希望能够做同样的事情来处理 byte[]
我正在尝试实现使用 JavaCv Surf 的示例。我下载了示例代码、.jar 文件并安装了官方网页要求的所有内容 (http://code.google.com/p/javacv/)。但似乎缺少一个
我正在开发一个使用 Java 的应用程序,该应用程序可以纠正透视(也称为梯形校正)。为此,我使用 Bytedeco's JavaCV 。引用documentations和其他几个websites和在线
我是 JavaCV/OpenCV 的新手,所以如果我是一个完全的白痴,请提前道歉...... 我需要检测图像中的“主要/主要”人脸(此图像大部分是“个人资料图片”),人脸识别 不需要。 由于不同haa
我想通过 Java 轻松捕获我的网络摄像头。我按照本教程使用 JavaCV 和 OpenCV:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/o
我在使用 JavaCV 时遇到问题。 我下载了javaCV-bin 我在 ubuntu 上的引用库中的项目中添加了 .jar 文件 我可以使用位于下载文件中的示例代码 但是错误是 Exception
我正在尝试使用 JavaCV 在我的照片数据库中实现人脸识别。虽然检测可能的面孔工作正常(已经有很多 Java 示例),但我仍然坚持进行实际识别。更准确地说,是训练人脸识别器。 出于测试目的,我有一个
我正在尝试使用 JavaCV 实现使用 ORB 算法的图像识别。根据一些论文[1] , [2] ,ORB关键点描述符是一个二进制字符串。那么,如何在获取图像的关键点后得到这个二进制字符串呢? 这是我获
我对 JavaCV FFmpegFrameRecorder 的使用有点困惑。我有几个 byte[] 或 short[] 数组(取决于我的图像是 8 位还是 16 位)是否有与多个图像相关的数据。现在,
我正在尝试使用 Java 从相机获取一些图像,但我遇到了一些问题;任何帮助将不胜感激! 代码如下: 错误日志: Exception in thread "main" java.
以下 JavaCV 代码有什么问题?我尝试填充 CvSeq 以进行进一步的工作,但 JVM 几乎 在不同位置可靠地崩溃,并出现 EXCEPTION_ACCESS_VIOLATION,最常见的是 [ms
我正在尝试过滤掉图像中的轮廓。我的代码没有语法错误,但当我运行程序时,我只是得到很多红色文本。我已定位故障点为cvInRangeS。 cvInRangeS(imghsv,minc,maxc,imgbi
我刚刚找到了一个很好的 JavaCV 示例,它使用 FFmpegFrameGrabber为应该“快”的Linux制作屏幕截图代码: try { int x = 0, y = 0, w = 13
我正在尝试使用 HoughCircles 的 JavaCV 实现方法,但我在参数方面遇到了一些问题。这是我的代码: Mat currentImageGray = tgtFrag.getImage().
我正在尝试使用 FFmpegFrameRecorder 从一组图像中制作一个视频 .mp4 文件作为更大程序的一部分,因此我设置了一个测试项目,在其中尝试制作一个25fps 的同一帧的 100 个实例
我想不断捕捉网络摄像头并让它在 Canvas 上查看。图像的保存很好。它每秒拍摄一张照片。但是 canvas.showImage() 不起作用。我的屏幕仍然空白。控制台在每一帧都显示“清理相机”。 头
我从昨天开始用 android 做 javacv,在使用 FFmpegFrameRecorder 或 FrameRecorder 从图像 (IplImage) 生成视频时出错,同时在使用 cvCvtC
我在我的项目中使用 javaCV 信封,当我尝试使用 cvLoad 函数从 xml (haarcascade_frontalface_default.xml) 加载 Haar 级联时,我从中得到 nu
我在使用 JavaCV 实现的这个项目中遇到了问题。我想至少找到二值图像中最顶部、最底部、最左侧和最右侧的点: 我这里指的点是 (x,y) 坐标。我已经尝试实现 HoughLines(它只检测直线而不
我是一名优秀的程序员,十分优秀!