一、官方网站下载sdk:https://opencv.org
1、悬停Library后点击Releases
2、点击Android,打开网页后会自动下载
打开后得到以下内容
二、打开Android新建项目进行测试,依次点击File -> New -> New Project
- 选择
Empty Activity
,点击Next
Name
栏输入OpenCVTest
(命名自定义),点击Finish
三、将OpenCV SDK导入项目
- 将视图切换到
Project
,右键项目总目录,选择New -> Module
然后选择Android Library
,将模块命名为opencv-test
(自定义命名)
最后点击Finish
- 删除目录下所有内容
- 复制
sdk
目录下的内容到模块opencv-test
下
- 打开
opencv-test
目录下的build.gradle
文件,删除图中kotlin
那一行,然后点击Sync Now
- 显示
BUILD SUCCESSFUL
即可
四、将opencv-test模块依赖到app模块中
- 打开
app
模块下的build.gradle
,在dependencies
中加入以下内容,点击Sync Now
implementation 'com.rabbitmq:amqp-client:5.12.0'
implementation project(path: ':opencv-test')
- 在
app
模块下的src/main/java
的包目录下新建Activity
:OpencvTestActivity
public class OpencvTestActivity extends Activity {
ConnectionFactory factory;
//定义线程池处理上帝视角引起的程序卡死问题
private final ThreadPoolExecutor threadPoolExecutor = new
ThreadPoolExecutor(3, 10, 1, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>());
private boolean mQuit = false;//当为true的时候退出画图线程
private boolean closeCompleteFlag = false;//当为true的时候表示通道和连接都关闭
//播放视频页面(前、后、左、右)
private SurfaceHolder surfaceHolder;
private static final String TAG = "opencv启动日志";
//消费rabbitmq数据的线程
Runnable basicConsumeRunnable;
volatile String picture;
//画图的runnable
Runnable drawRunnable;
//全局定义各视角连接和通道,便于退出Activity后关闭
Connection connection;
Channel channel;
//关闭通道和连接的runnable
Runnable closeRunnable;
private final String TAG_THREAD = "线程池";
private static final String TAG_RABBITMQ = "RabbitMQ";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_opencv);
//初始化opencv相关变量
initOpencv();
playVideo();
}
private void initOpencv() {
SurfaceView mySurfaceView = findViewById(R.id.surfaceViewTest);
surfaceHolder = mySurfaceView.getHolder();
setupConnectionFactory();
}
//上帝视角相关函数以及线程的开启和关闭 Start
@SuppressLint("HandlerLeak")
private void playVideo() {
//用于从线程中获取数据,更新ui
Handler incomingMessageHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
picture = msg.getData().getString("msg");
}
};
//视频号
basicConsumeRunnable = getBasicConsumeRunnable(incomingMessageHandler);
threadPoolExecutor.execute(basicConsumeRunnable);
surfaceHolder.addCallback(new SurfaceHolder