标签: javacv

在OpenCV中将Mat对象从本机代码返回到java

我有一个OpenCV Android应用程序.它的大部分代码都是用Java编写的,但我有一个函数在C中.函数获取一个Mat对象并返回一个新对象.

我的问题是如何将本机代码中的Mat返回给Java?找不到任何例子.

谢谢.

android opencv javacv

9
推荐指数
2
解决办法
1万
查看次数

opencv/javacv:如何迭代轮廓以进行形状识别?

我正在使用JavaCV开发一个形状识别项目,我发现了一些OpenCV代码来识别特定图像中的U形状.我试图将其转换为JavaCV,但它没有提供相同的输出.你能帮我把这个OpenCV代码转换成JavaCV吗?

这是OpenCV代码:

import cv2
import numpy as np

img = cv2.imread('sofud.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,1)
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    if 10 < w/float(h) or w/float(h) < 0.1:
        cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)

cv2.imshow('res',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

这是预期的产出

在此输入图像描述

这是转换后的代码:

import com.googlecode.javacpp.Loader;
import com.googlecode.javacv.CanvasFrame;
import static com.googlecode.javacpp.Loader.*;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
import java.io.File;
import javax.swing.JFileChooser;

public class TestBeam {
    public static void main(String[] args) {
        CvMemStorage storage=CvMemStorage.create();
        CvSeq squares = new CvContour();
        squares = …
Run Code Online (Sandbox Code Playgroud)

java opencv image-processing javacv

9
推荐指数
1
解决办法
7644
查看次数

如何在javacv中获取提取对象的x,y坐标?

目前我正在开发图像处理项目,我正在使用javacv开发图像处理组件.我能够提取图像的一些有趣部分,现在我需要读取这些对象的x和y坐标.这是我提取的图像

在此输入图像描述

我需要识别这些对象并围绕这些对象绘制正方形.我浏览了一些教程并尝试使用以下代码识别对象.

    IplImage img="sourceimage";
    CvSize sz = cvSize(img.width(), img.height());
    IplImage gry=cvCreateImage(sz, img.depth(), 1);
    cvCvtColor(img, gry, CV_BGR2GRAY);
    cvThreshold(gry, gry, 200, 250, CV_THRESH_BINARY);


    CvMemStorage mem = CvMemStorage.create();
    CvSeq contours = new CvSeq();
    CvSeq ptr = new CvSeq();
    cvFindContours(gry, mem, contours, Loader.sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

    CvRect boundbox;

    for (ptr = contours; ptr != null; ptr = ptr.h_next()) {
        boundbox = cvBoundingRect(ptr, 0);
        if(boundbox.height()>10||boundbox.height()>10){
            cvRectangle( gry, cvPoint( boundbox.x(), boundbox.y() ), cvPoint( boundbox.x() + boundbox.width(), boundbox.y() + boundbox.height()),CvScalar.BLUE, 0, 0, 0 );
            System.out.println(boundbox.x()+", "+boundbox.y()); …
Run Code Online (Sandbox Code Playgroud)

java opencv image-processing javacv

9
推荐指数
1
解决办法
5216
查看次数

需要JavaCV FFmpegFrameRecorder属性说明

我正在使用FFmpegFrameRecorder从我的网络摄像头获取视频输入并将其录制到视频文件中.问题是我正在使用我发现的一些不同的演示源代码来构建我的应用程序,并且我使用的属性对我来说并不完全清楚.

首先,这是我的代码片段:

FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(FILENAME,  grabber.getImageWidth(),grabber.getImageHeight());

        recorder.setVideoCodec(13);
        recorder.setFormat("mp4");
        recorder.setPixelFormat(avutil.PIX_FMT_YUV420P);
        recorder.setFrameRate(30);
        recorder.setVideoBitrate(10 * 1024 * 1024);

        recorder.start();
Run Code Online (Sandbox Code Playgroud)
  • setVideoCodec(13) - 这是什么意思(13)我怎么能理解任何数字背后的实际编解码器是什么?
  • setPixelFormat - 只是得到这个,不知道它一般在做什么
  • setFrameRate(30) - 我认为这应该很清楚,但我们选择的帧速率背后的逻辑是什么(不是越高越好?)
  • setVideoBitrate(10*1024*1024) - 再次几乎不知道这是什么以及数字背后的逻辑是什么?

最后,我只想提一下我记录这样的视频的最后一个问题.如果视频的实际长度让我们说20秒.当我播放从该程序创建的视频文件时,它运行得更快.无法判断它是否比它应该快2倍,但总的来说,如果我录制20秒的视频,那么它的播放时间大约为10秒.可能导致此问题的原因以及如何解决?

ffmpeg javacv

9
推荐指数
1
解决办法
1万
查看次数

一起使用JavaCV和Realm会导致"java.lang.UnsatisfiedLinkError"

我最近通过尝试启动JavaCV的FFmpegFrameGrabber实例来获得以下错误:

java.lang.UnsatisfiedLinkError: org.bytedeco.javacpp.avutil
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:324)
    at org.bytedeco.javacpp.Loader.load(Loader.java:413)
    at org.bytedeco.javacpp.Loader.load(Loader.java:381)
    at org.bytedeco.javacpp.avformat$AVFormatContext.<clinit>(avformat.java:2597)
    at org.bytedeco.javacv.FFmpegFrameGrabber.startUnsafe(FFmpegFrameGrabber.java:386)
    at org.bytedeco.javacv.FFmpegFrameGrabber.start(FFmpegFrameGrabber.java:380)...
Run Code Online (Sandbox Code Playgroud)

虽然存在这个问题的解决方案,但没有一个对我有用.

经过多次试验,我发现奇怪的是,如果我在项目中不包含Realm,我就不会再收到此错误.

这是我的build.gradle文件的一部分,其中包含所有这些库:

compile group: 'org.bytedeco', name: 'javacv', version: '1.1'
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.0.0-1.1', classifier: 'android-arm'
compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.0.0-1.1', classifier: 'android-x86'
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.8.1-1.1', classifier: 'android-arm'
compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '2.8.1-1.1', classifier: 'android-x86'

// ORM
compile 'io.realm:realm-android:0.87.2' // Tested NOT OK - Causes JavaCV to crash
//
Run Code Online (Sandbox Code Playgroud)

我在想,这个问题可能有一个我不知道的解决方案.我发现网上任何地方都没有提到库不兼容或者为什么会出现这种情况.

我将使用任何人可能需要的任何其他详细信息来编辑此帖子. …

java android realm javacv

9
推荐指数
1
解决办法
2129
查看次数

在 Android 屏幕录制中 - 如何获取每一帧?

我正在使用 MediaRecorder 和 MediaProjection Api 在 android 应用程序中录制屏幕。我无法获得可以通过 rtmp 流发送的每个帧。为了通过 RTMP 流发布,我使用 JAVACV Android 库。

例如 - 在通过相机直播的情况下,我们可以在 onPreviewFrame() 回调中获取每一帧。获取每一帧后,我只需使用 JAVACV 库的 FFmpegFrameRecorder 将每一帧流式传输到 rtmp url。

如何通过屏幕录制实现相同的效果?

任何帮助将不胜感激。提前致谢!

android mediarecorder javacv android-ffmpeg

9
推荐指数
1
解决办法
1571
查看次数

如何使用javacv识别长度和宽度可变的方形或矩形?

我正在使用java开发项目来识别使用opencv包的组件,但我是javacv的新手,我只是想知道如何识别特定源图像中的矩形,请一些经验人员给出一些基本的指导来存档这个任务.我尝试在这里使用模板匹配,但它只能识别确切大小的矩形.但在我的情况下,我需要识别变长矩形?

import java.util.Arrays;
import static com.googlecode.javacv.cpp.opencv_core.*;
import static com.googlecode.javacv.cpp.opencv_imgproc.*;
import static com.googlecode.javacv.cpp.opencv_highgui.*;
public class TestingTemplate {
public static void main(String[] args) {
//Original Image
IplImage src = cvLoadImage("src\\lena.jpg",0);
//Template Image
IplImage tmp = cvLoadImage("src\\those_eyes.jpg",0);
//The Correlation Image Result
IplImage result = cvCreateImage(cvSize(src.width()-tmp.width()+1, src.height()-tmp.height()+1), IPL_DEPTH_32F, 1);
//Init our new Image
cvZero(result);
cvMatchTemplate(src, tmp, result, CV_TM_CCORR_NORMED);

double[] min_val = new double[2];
double[] max_val = new double[2];

//Where are located our max and min correlation points
CvPoint minLoc = new CvPoint();
CvPoint maxLoc …
Run Code Online (Sandbox Code Playgroud)

java opencv image-processing javacv

8
推荐指数
1
解决办法
1万
查看次数

使用JavaCV和FFmpeg播放视频

所以,我正在为Android开发一个自定义视频播放器,但我需要播放超过Android支持的视频文件(mp4,3gp ...),如wmv,avi,flv.

此时我已经将任何视频类型转换为.mp4并且我可以在重新编码后播放它们,但我不知道如何在不将它们重新编码为mp4的情况下播放这些wmv,avi文件.

我有什么方法可以在Android上播放任何视频而无需重新编码吗?JavaCV + FFmpeg库已经工作,只是不知道该怎么做.

顺便说一句,继承人我用来重新编码视频的代码:

public static void convert(File file) {

    FFmpegFrameGrabber frameGrabber =
            new FFmpegFrameGrabber(file.getAbsolutePath());

    IplImage captured_frame = null;

    FrameRecorder recorder = null;
    recorder = new FFmpegFrameRecorder("/mnt/sdcard/external_sd/videosteste/primeiroteste.mp4", 300, 300);
    recorder.setVideoCodec(13);
    recorder.setFrameRate(30);
    recorder.setFormat("mp4");
    try {
        recorder.start();
        frameGrabber.start();
        while (true) {
            try {
                captured_frame = frameGrabber.grab();

                if (captured_frame == null) {
                    System.out.println("!!! Failed cvQueryFrame");
                    break;
                }
                recorder.record(captured_frame);
            } catch (Exception e) {
            }
        }
        recorder.stop();
        recorder.release();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

video android ffmpeg javacv android-videoview

8
推荐指数
1
解决办法
6782
查看次数

Javacv:解码来自android设备上的red5服务器的H.264"实时"流

这是我的问题,我已经使用Red5实现了一个服务器端应用程序,它发送H.264编码的直播流,在客户端,流被接收为byte []
为了在Android客户端端解码它我已经跟随Javacv- FFmpeg库.解码代码如下

public Frame decodeVideo(byte[] data,long timestamp){
           frame.image = null;
           frame.samples = null;
           avcodec.av_init_packet(pkt);
           BytePointer video_data = new BytePointer(data);
           avcodec.AVCodec codec = avcodec.avcodec_find_decoder(codec_id);
           video_c = null;
           video_c = avcodec.avcodec_alloc_context3(codec);
           video_c.width(320);
           video_c.height(240);
           video_c.pix_fmt(0);
           video_c.flags2(video_c.flags2()|avcodec.CODEC_FLAG2_CHUNKS);
           avcodec.avcodec_open2(video_c, codec, null))
           picture = avcodec.avcodec_alloc_frame()
           pkt.data(video_data);
           pkt.size(data.length);
           int len = avcodec.avcodec_decode_video2(video_c, picture, got_frame, pkt);
           if ((len >= 0) && ( got_frame[0] != 0)) {
             ....
              process the decoded frame into **IPLImage of Javacv** and render it with **Imageview** of Android …
Run Code Online (Sandbox Code Playgroud)

android ffmpeg red5 live-streaming javacv

8
推荐指数
1
解决办法
4243
查看次数

在纵向模式下,JavaCV录像机方向不正确

您好我使用https://github.com/bytedeco/javacv/录制视频.使用横向模式时,方向很好但是当我将方向更改为纵向模式时,视频旋转-90度.任何机构都知道我可能做错了什么.这是代码.

package org.bytedeco.javacv_android_example.record;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.os.PowerManager;
import android.util.Log;
import android.view.Display;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

import org.bytedeco.javacpp.opencv_core;
import org.bytedeco.javacpp.opencv_imgproc;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv_android_example.R;

import java.io.File;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ShortBuffer;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class RecordActivity …
Run Code Online (Sandbox Code Playgroud)

android video-capture rotation android-camera javacv

8
推荐指数
1
解决办法
1325
查看次数