我正在尝试编写一个AR应用程序,到目前为止我已经使用opencv进行图像变形和事情,但是逐个变形视频帧在计算上是昂贵的。因此,我正在尝试迁移到opengl进行扩充。
到目前为止,我试图获取相机帧数据,将其转换为java部分中的opencv矩阵,然后在本机代码中从中创建纹理。它有点工作,但结果中有一些奇怪的标记:
正如@Micka建议的那样,这是我的代码片段:
java部分:
public void onPreviewFrame(byte[] frame, Camera arg1) {
mFrame.put(0, 0, frame);
processFrame(mFrame.getNativeObjAddr());
}
原生部分:
JNIEXPORT void JNICALL Java_com_..._CameraPreviewer_processFrame( JNIEnv* env, jobject thiz, jlong addr)
cv::Mat& mFrame = *(cv::Mat*)addr;
cv::cvtColor(mFrame, buffer[(bI) % 30], cv::COLOR_YUV2BGR_NV21);
}
和onDrawFrame渲染器(原生):
{
...
cvtColor(buffer[(bI) % 30], frame, CV_BGR2BGR565);
glTexSubImage2D(GL_TEXTURE_2D, 0, (1024-frameWidth)/2, (1024-frameHeight)/2, frameWidth, frameHeight, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, frame.ptr());
...
}