Skip to content

Commit 840454e

Browse files
committed
update data and tolist for mat
1 parent c204d33 commit 840454e

26 files changed

+451
-349
lines changed

.pubignore

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ coverage/
1010
*.dylib
1111
*.lib
1212
pkgs/
13-
src/*.cpp
14-
src/*.h
13+
src/**/*.cpp
14+
src/**/*.h
1515
images/
1616
CMakeUserPresets*
1717
ffigen*

example/lib/main.dart

Lines changed: 21 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import 'dart:async';
1+
import 'dart:isolate';
22
import 'dart:typed_data';
33

4-
import 'package:camera_universal/camera_universal.dart';
4+
import 'package:flutter/foundation.dart';
55
import 'package:flutter/material.dart';
6-
76
import 'package:opencv_dart/opencv_dart.dart' as cv;
87

98
void main() {
@@ -19,57 +18,33 @@ class MyApp extends StatefulWidget {
1918

2019
class _MyAppState extends State<MyApp> {
2120
var images = <Uint8List>[];
22-
Uint8List? videoFrame;
23-
CameraController cameraController = CameraController();
2421

2522
@override
2623
void initState() {
2724
super.initState();
28-
task();
29-
}
30-
31-
Future<void> task() async {
32-
await cameraController.initializeCameras();
33-
await cameraController.initializeCamera(
34-
setState: setState,
35-
);
36-
await cameraController.activateCamera(
37-
setState: setState,
38-
mounted: () {
39-
return mounted;
40-
},
41-
);
42-
}
43-
44-
void takePicture() async {
45-
var frame = cv.Mat.empty();
46-
if (cameraController.is_camera_init) {
47-
final im = await cameraController.action_take_picture(
48-
onCameraNotInit: () {},
49-
onCameraNotSelect: () {},
50-
onCameraNotActive: () {});
51-
if (im != null) {
52-
frame = cv.imread(im.path);
53-
}
54-
}
55-
if (!frame.isEmpty) {
56-
setState(() {
57-
videoFrame = cv.imencode(cv.ImageFormat.png.ext, frame);
58-
});
59-
}
6025
}
6126

6227
@override
6328
void dispose() {
64-
cameraController.dispose();
6529
super.dispose();
6630
}
6731

32+
// native resources are unsendable for isolate, so use raw data or encoded Uint8List and convert back
33+
Future<(Uint8List, Uint8List)> heavyTask(Uint8List buffer) async {
34+
final ret = Isolate.run(() {
35+
final im = cv.imdecode(Uint8List.fromList(buffer), cv.IMREAD_COLOR);
36+
late cv.Mat gray, blur;
37+
for (var i = 0; i < 1000; i++) {
38+
gray = cv.cvtColor(im, cv.COLOR_BGR2GRAY);
39+
blur = cv.gaussianBlur(im, (7, 7), 2, sigmaY: 2);
40+
}
41+
return (cv.imencode(cv.ImageFormat.png.ext, gray), cv.imencode(cv.ImageFormat.png.ext, blur));
42+
});
43+
return ret;
44+
}
45+
6846
@override
6947
Widget build(BuildContext context) {
70-
const textStyle = TextStyle(fontSize: 25);
71-
const spacerSmall = SizedBox(height: 10);
72-
7348
return MaterialApp(
7449
home: Scaffold(
7550
appBar: AppBar(
@@ -79,50 +54,15 @@ class _MyAppState extends State<MyApp> {
7954
alignment: Alignment.center,
8055
child: Column(
8156
children: [
82-
Expanded(
83-
flex: 1,
84-
child: Row(
85-
children: [
86-
Expanded(
87-
child: Camera(
88-
cameraController: cameraController,
89-
onCameraNotInit: (context) {
90-
return const SizedBox.shrink();
91-
},
92-
onCameraNotSelect: (context) {
93-
return const SizedBox.shrink();
94-
},
95-
onCameraNotActive: (context) {
96-
return const SizedBox.shrink();
97-
},
98-
onPlatformNotSupported: (context) {
99-
return const SizedBox.shrink();
100-
},
101-
),
102-
),
103-
Expanded(
104-
child: videoFrame == null
105-
? Text("Empty")
106-
: Image.memory(videoFrame!))
107-
],
108-
),
109-
),
11057
ElevatedButton(
11158
onPressed: () async {
112-
final data = await DefaultAssetBundle.of(context)
113-
.load("images/lenna.png");
114-
final im =
115-
cv.imdecode(data.buffer.asUint8List(), cv.IMREAD_COLOR);
116-
final gray = cv.cvtColor(im, cv.COLOR_BGR2GRAY);
117-
final blur = cv.gaussianBlur(im, (7, 7), 2, sigmaY: 2);
59+
final data = await DefaultAssetBundle.of(context).load("images/lenna.png");
60+
final bytes = data.buffer.asUint8List();
61+
// heavy computation
62+
final (gray, blur) = await heavyTask(bytes);
11863
setState(() {
119-
images = [
120-
data.buffer.asUint8List(),
121-
cv.imencode(cv.ImageFormat.png.ext, gray),
122-
cv.imencode(cv.ImageFormat.png.ext, blur)
123-
];
64+
images = [bytes, gray, blur];
12465
});
125-
takePicture();
12666
},
12767
child: const Text("Process"),
12868
),

example/windows/runner/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
2626

2727
FlutterWindow window(project);
2828
Win32Window::Point origin(10, 10);
29-
Win32Window::Size size(1280, 720);
29+
Win32Window::Size size(541, 720);
3030
if (!window.Create(L"opencv_dart_example", origin, size)) {
3131
return EXIT_FAILURE;
3232
}

ffigen.yaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ headers:
5353
- src/stitching/stitching.h
5454
- src/video/video.h
5555
- src/video/videoio.h
56-
# functions:
57-
# symbol-address:
58-
# include:
59-
# - ".*" # Do this to expose all function pointers.
56+
functions:
57+
symbol-address:
58+
include:
59+
- "Mat_CloseVoid"
60+
# - ".*" # Do this to expose all function pointers.
6061
# exclude: # If you only use exclude, then everything not excluded is generated.
6162
# - "dispose"
6263

lib/src/core/array.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ class U8Array extends NativeArray<ffi.Uint8, int> {
3838
return array;
3939
}
4040

41+
U8Array.fromPointer(ffi.Pointer<ffi.Uint8> ptr, int length) : super(length) {
42+
this.ptr = ptr;
43+
finalizer.attach(this, ptr);
44+
}
45+
4146
static final finalizer = Finalizer<ffi.Pointer<ffi.Uint8>>((p) => calloc.free(p));
4247

4348
@override

lib/src/core/cv_vec.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import '../opencv.g.dart' as cvg;
77

88
abstract class CvVec<T extends ffi.Struct> extends CvStruct<T> {
99
CvVec.fromPointer(super.ptr) : super.fromPointer();
10+
List<num> get val;
1011
}
1112

1213
/// uchar

lib/src/core/exception.dart

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,21 @@ class CvException implements Exception {
2929

3030
void defaultCvErrorCallback(
3131
int code,
32-
ffi.Pointer<ffi.Char> func_name,
33-
ffi.Pointer<ffi.Char> err_msg,
34-
ffi.Pointer<ffi.Char> file_name,
32+
ffi.Pointer<ffi.Char> funcName,
33+
ffi.Pointer<ffi.Char> errMsg,
34+
ffi.Pointer<ffi.Char> fileName,
3535
int line,
3636
ffi.Pointer<ffi.Void> userdata,
3737
) {
38-
final err = err_msg.cast<Utf8>();
39-
;
40-
final func = func_name.cast<Utf8>();
41-
final file = file_name.cast<Utf8>();
42-
print(
43-
"OpenCV Native Error Occurred (code: $code, err: ${err.toDartString()}) in ${func.toDartString()} of file ${file.toDartString()}:$line");
38+
final err = errMsg.cast<Utf8>();
39+
final func = funcName.cast<Utf8>();
40+
final file = fileName.cast<Utf8>();
41+
final msg = "OpenCV Native Error Occurred ("
42+
"code: $code, "
43+
"err: ${err.toDartString()}) "
44+
"func: ${func.toDartString()} "
45+
"file: ${file.toDartString()}:$line";
46+
print(msg);
4447
calloc.free(err);
4548
calloc.free(func);
4649
calloc.free(file);
@@ -54,9 +57,9 @@ void registerErrorCallback({cvg.DartErrorCallbackFunction? callback}) {
5457
CFFI.registerErrorCallback(fp.nativeFunction);
5558
}
5659

57-
class OpenCvDartException implements Exception {
60+
class CvdException implements Exception {
5861
final String message;
59-
OpenCvDartException(this.message);
62+
CvdException(this.message);
6063

6164
@override
6265
String toString() {

0 commit comments

Comments
 (0)