i.MX6 및 Android 4.4를 사용하여 실시간으로 감지 한 카메라 및 회선을 표시하려고합니다. 안드로이드 카메라 인 .addCallbackBuffer를 사용하여 프레임을 가져오고 TextureView를 사용하여 카메라 미리보기를 표시합니다.TextureView를 사용하여 카메라 미리보기와 감지 된 선을 동시에 표시 할 수 있습니까?
JNI (C++) 이미지 처리를 수행하는 데 사용되었다 OpenCV보다> 바이트 [] Mat-로 변환> 프레임 buffer- 얻을
JNI 매트를 반환 할 수이미 위에 선을 그리는 (.getNativeObjAddr()를 사용) 또는 라인의 시작과 끝 지점 인 두 좌표를 반환하십시오.
이 코드는 JNI의 새로운 매트이며 두 좌표를 반환하기를 바랍니다. 이 메소드가 작동하지 않으면 Java에서 Mat를 새로 작성하고 .getNativeObjAddr()을 JNI로 보낸 다음 Mat를 리턴하십시오. TextureView에서 매트 보이기?
질문 : TextureView를 사용하여 카메라 미리보기와 감지 된 라인을 동시에 표시하는 방법은 무엇입니까?
getFrameThread에서public class MainActivity extends Activity implements TextureView.SurfaceTextureListener, PreviewCallback {
protected Camera mCamera;
private TextureView mTextureView;
public byte[][] cameraBuffer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mTextureView = new TextureView(this);
mTextureView.setSurfaceTextureListener(this);
setContentView(mTextureView);
}
....
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
mCamera = Camera.open(0);
int bufferSize = mCamera.getParameters().getPictureSize().width * mCamera.getParameters().getPictureSize().height
* ImageFormat.getBitsPerPixel(mCamera.getParameters().getPreviewFormat())/8;
cameraBuffer = new byte[3][bufferSize];
thread = new getFrameThread(this, kCameraWidth, kCameraHeight);
for (int i = 0; i < 3; ++i)
mCamera.addCallbackBuffer(cameraBuffer[i]);
mCamera.setPreviewCallbackWithBuffer(this);
thread.start();
if (mCamera == null) {
throw new RuntimeException("Default camera not available");
}
try {
mCamera.setPreviewTexture(surface);
mCamera.startPreview();
} catch (IOException ioe) {
// Something bad happened
}
}
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// TODO Auto-generated method stub
camera.addCallbackBuffer(data);//callback data to cameraBuffer
thread.refresh(data, countFrame);//send new frame data to JNI
}
....
static {
System.loadLibrary("opencv_java"); //load opencv_java lib
System.loadLibrary("testLib");
}
public native void getRawFrame(byte[] data,int width, int height, int count);
}
이 (스레드 JNI 기능 'getRawFrame'를 실행) JNI에서
public class getFrameThread extends Thread{
public byte[] data;
{
.....
mainActivity.getRawFrame(data, 480, 720);
.....
}
public void refresh(byte[] data, int countFrame){
this.data = data;
}
}
을
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
using namespace cv;
extern"C"
{
.....
JNIEXPORT void JNICALL Java_com_example_adas_MainActivity_getRawFrame(JNIEnv* env, jobject thisobject,
jbyteArray data, jint width, jint height){
int length = env->GetArrayLength(data);
unsigned char *bufferIn = (unsigned char*) env->GetPrimitiveArrayCritical(data, NULL);
yuvMat = Mat(height * 3/2, width, CV_8UC1, bufferIn);
cvtColor(yuvMat, grayMat, cv::COLOR_YUV2GRAY_I420);
//Do lines detected
.....
env->ReleasePrimitiveArrayCritical(data, bufferIn, JNI_ABORT);
}
감사합니다. OpenCV의 결과를 표시하는 OpenGL을 시도해 보겠습니다. –
OpenCV의 결과를 표시하기 위해 OpenGL을 사용하는 힌트 또는 기능을 제공 할 수 있습니까? 감사. –
[graphika] (https://github.com/google/grafika)를 Android 카메라와 OpenGL 관계를 배우기위한 좋은 출발점으로 추천 할 수 있습니다. 이 [article] (http://www.anandmuralidhar.com/blog/android/corners/)도 유용 할 것입니다. 그것은 내 요점을 보여줍니다 : 전체 흐름이 약간 지연 되더라도 빨간 점이 화면의 올바른 픽셀에 고정됩니다. –