Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
132 changes: 61 additions & 71 deletions cvimage.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,91 +6,81 @@
* @flow
* @author Adam Freeman, adamgf@gmail.com
*/
import { NativeModules } from 'react-native';
import React, {Component} from 'react';
import React, { Component } from 'react';
import { Platform, Image } from 'react-native';
const { RNOpencv3 } = NativeModules;
import { ColorConv } from './constants';
import RNOpencv3 from './spec/turbomodule/NativeRNOpencv3';
import { downloadAssetSource } from './downloadAssetSource';

var RNFS = require('react-native-fs')
var RNFS = require('react-native-fs');

export class CvImage extends Component {

constructor(props) {
super(props)
this.resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource')
this.state = { 'destFile' : '' }
super(props);
this.resolveAssetSource = require('react-native/Libraries/Image/resolveAssetSource');
this.state = { destFile: '' };
}

componentDidMount = () => {
const assetSource = this.props.source
const uri = this.resolveAssetSource(assetSource).uri
const downloadAssetSource = require('./downloadAssetSource');

downloadAssetSource(uri)
.then((sourceFile) => {
let srcMat
let dstMat
RNOpencv3.Mat().then((res) => {
dstMat = res
RNOpencv3.imageToMat(sourceFile).then((res) => {
srcMat = res
RNFS.unlink(sourceFile).then(() => {
const assetSource = this.props.source;
const uri = this.resolveAssetSource(assetSource).uri;

// replace srcMat and dstMat strings with actual srcMat and dstMat
const { cvinvoke } = this.props
if (cvinvoke) {
for (let i=0;i < cvinvoke.paramsArr.length;i++) {
let params = cvinvoke.paramsArr[i]
for (let j=0;j < Object.keys(params).length;j++) {
const pnum = 'p' + (j + 1).toString()
if (params[pnum] && params[pnum] === 'srcMat') {
params[pnum] = srcMat
}
if (params[pnum] && params[pnum] === 'dstMat') {
params[pnum] = dstMat
downloadAssetSource(uri)
.then(sourceFile => {
let srcMat;
let dstMat;
RNOpencv3.Mat().then(res => {
dstMat = res;
RNOpencv3.imageToMat(sourceFile).then(res => {
srcMat = res;
RNFS.unlink(sourceFile)
.then(() => {
// replace srcMat and dstMat strings with actual srcMat and dstMat
const { cvinvoke } = this.props;
if (cvinvoke) {
for (let i = 0; i < cvinvoke.paramsArr.length; i++) {
let params = cvinvoke.paramsArr[i];
for (let j = 0; j < Object.keys(params).length; j++) {
const pnum = 'p' + (j + 1).toString();
if (params[pnum] && params[pnum] === 'srcMat') {
params[pnum] = srcMat;
}
if (params[pnum] && params[pnum] === 'dstMat') {
params[pnum] = dstMat;
}
}
}
//alert('cvinvoke is: ' + JSON.stringify(this.props.cvinvoke))
RNOpencv3.invokeMethods(cvinvoke);
}
}
//alert('cvinvoke is: ' + JSON.stringify(this.props.cvinvoke))
RNOpencv3.invokeMethods(cvinvoke)
}

RNOpencv3.matToImage(dstMat, sourceFile)
.then((image) => {
RNOpencv3.deleteMat(srcMat)
RNOpencv3.deleteMat(dstMat)
const { width, height, uri } = image
if (uri && uri.length > 0) {
this.setState({ destFile : uri })
}
else {
console.error('Error getting image information.')
}
})
.catch((err) => {
console.error(err)
})
})
.catch((err) => {
console.error(err)
})
})
RNOpencv3.matToImage(dstMat, sourceFile)
.then(image => {
RNOpencv3.deleteMat(srcMat);
RNOpencv3.deleteMat(dstMat);
const { width, height, uri } = image;
if (uri && uri.length > 0) {
this.setState({ destFile: uri });
} else {
console.warning('Error getting image information.');
}
})
.catch(err => {
console.warning(err);
});
})
.catch(err => {
console.warning(err);
});
});
});
})
})
.catch((err) => {
console.error(err)
})
}
.catch(err => {
console.warning(err);
});
};

render() {
let imageFilePath = this.resolveAssetSource(this.props.source).uri
if (this.state.destFile.length > 0) {
const prependFilename = Platform.OS === 'ios' ? '' : 'file://'
imageFilePath = prependFilename + this.state.destFile
}
return(
<Image {...this.props} source={{uri:`${imageFilePath}`}} />
)
let imageFilePath = this.resolveAssetSource(this.props.source).uri;
return <Image {...this.props} source={{ uri: `${imageFilePath}` }} />;
}
}
2 changes: 1 addition & 1 deletion downloadAssetSource.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,4 @@ async function downloadAssetSource(uri) {
})
}

module.exports = downloadAssetSource;
export {downloadAssetSource}
6 changes: 6 additions & 0 deletions harmony/opencv3/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/node_modules
/oh_modules
/.preview
/build
/.cxx
/.test
2 changes: 2 additions & 0 deletions harmony/opencv3/Index.ets
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from "./src/main/ets/RNOpencvPackage";
export * from "./src/main/ets/CvCameraView"
13 changes: 13 additions & 0 deletions harmony/opencv3/build-profile.json5
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"apiType": "stageMode",
"buildOption": {
},
"targets": [
{
"name": "default"
},
{
"name": "ohosTest"
}
]
}
6 changes: 6 additions & 0 deletions harmony/opencv3/hvigorfile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { harTasks } from '@ohos/hvigor-ohos-plugin';

export default {
system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
plugins:[] /* Custom plugin to extend the functionality of Hvigor. */
}
9 changes: 9 additions & 0 deletions harmony/opencv3/oh-package.json5
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "@react-native-oh-tpl/react-native-opencv3",
"version": "1.0.0",
"description": "Please describe the basic information.",
"main": "Index.ets",
"author": "",
"license": "Apache-2.0",
"dependencies": {}
}
16 changes: 16 additions & 0 deletions harmony/opencv3/src/main/cpp/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

cmake_minimum_required(VERSION 3.13)
set(CMAKE_VERBOSE_MAKEFILE on)
set(rnoh_opencv_generated_dir "${CMAKE_CURRENT_SOURCE_DIR}/generated")

file(GLOB rnoh_opencv_SRC CONFIGURE_DEPENDS *.cpp)
file(GLOB_RECURSE rnoh_opencv_generated_SRC "${rnoh_opencv_generated_dir}/**/*.cpp")

add_library(rnoh_opencv SHARED ${rnoh_opencv_SRC} ${rnoh_opencv_generated_SRC})
target_include_directories(rnoh_opencv PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
${rnoh_opencv_generated_dir}
${CMAKE_CURRENT_SOURCE_DIR}/generated/react/render/components/react_native_opencv3
)

target_link_libraries(rnoh_opencv PUBLIC rnoh)
13 changes: 13 additions & 0 deletions harmony/opencv3/src/main/cpp/OpencvPackage.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#pragma once

#include "RNOH/generated/BaseReactNativeOpencv3Package.h"

namespace rnoh {

class OpencvPackage : public BaseReactNativeOpencv3Package {
using Super = BaseReactNativeOpencv3Package;

public:
OpencvPackage(Package::Context ctx) : Super(ctx) {}
};
} // namespace rnoh
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/**
* This code was generated by "react-native codegen-lib-harmony"
*/

#pragma once

#include <react/renderer/components/react_native_opencv3/ComponentDescriptors.h>
#include "RNOH/Package.h"
#include "RNOH/ArkTSTurboModule.h"
#include "RNOH/generated/turbo_modules/CvCameraModule.h"
#include "RNOH/generated/turbo_modules/RNOpencv3.h"
#include "RNOH/generated/components/CvCameraViewJSIBinder.h"

namespace rnoh {

class BaseReactNativeOpencv3PackageTurboModuleFactoryDelegate : public TurboModuleFactoryDelegate {
public:
SharedTurboModule createTurboModule(Context ctx, const std::string &name) const override {
if (name == "CvCameraModule") {
return std::make_shared<CvCameraModule>(ctx, name);
}
if (name == "RNOpencv3") {
return std::make_shared<RNOpencv3>(ctx, name);
}
return nullptr;
};
};

class BaseReactNativeOpencv3PackageEventEmitRequestHandler : public EventEmitRequestHandler {
public:
void handleEvent(Context const &ctx) override {
auto eventEmitter = ctx.shadowViewRegistry->getEventEmitter<facebook::react::EventEmitter>(ctx.tag);
if (eventEmitter == nullptr) {
return;
}

std::vector<std::string> supportedEventNames = {
"facesDetectedCv",
"cameraFrame",
"frameSize",
};
if (std::find(supportedEventNames.begin(), supportedEventNames.end(), ctx.eventName) != supportedEventNames.end()) {
eventEmitter->dispatchEvent(ctx.eventName, ArkJS(ctx.env).getDynamic(ctx.payload));
}
}
};


class BaseReactNativeOpencv3Package : public Package {
public:
BaseReactNativeOpencv3Package(Package::Context ctx) : Package(ctx){};

std::unique_ptr<TurboModuleFactoryDelegate> createTurboModuleFactoryDelegate() override {
return std::make_unique<BaseReactNativeOpencv3PackageTurboModuleFactoryDelegate>();
}

std::vector<facebook::react::ComponentDescriptorProvider> createComponentDescriptorProviders() override {
return {
facebook::react::concreteComponentDescriptorProvider<facebook::react::CvCameraViewComponentDescriptor>(),
};
}

ComponentJSIBinderByString createComponentJSIBinderByName() override {
return {
{"CvCameraView", std::make_shared<CvCameraViewJSIBinder>()},
};
};

EventEmitRequestHandlers createEventEmitRequestHandlers() override {
return {
std::make_shared<BaseReactNativeOpencv3PackageEventEmitRequestHandler>(),
};
}
};

} // namespace rnoh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/**
* This code was generated by "react-native codegen-lib-harmony"
*/

#pragma once
#include "RNOHCorePackage/ComponentBinders/ViewComponentJSIBinder.h"

namespace rnoh {
class CvCameraViewJSIBinder : public ViewComponentJSIBinder {
protected:
facebook::jsi::Object createNativeProps(facebook::jsi::Runtime &rt) override {
auto object = ViewComponentJSIBinder::createNativeProps(rt);
object.setProperty(rt, "facing", true);
object.setProperty(rt, "cvinvoke", true);
object.setProperty(rt, "useStorage", true);
object.setProperty(rt, "faceClassifier", true);
object.setProperty(rt, "eyesClassifier", true);
object.setProperty(rt, "noseClassifier", true);
object.setProperty(rt, "mouthClassifier", true);
object.setProperty(rt, "landmarksModel", true);
object.setProperty(rt, "overlayInterval", true);
return object;
}

facebook::jsi::Object createBubblingEventTypes(facebook::jsi::Runtime &rt) override {
facebook::jsi::Object events(rt);
return events;
}

facebook::jsi::Object createDirectEventTypes(facebook::jsi::Runtime &rt) override {
facebook::jsi::Object events(rt);
events.setProperty(rt, "topFacesDetectedCv", createDirectEvent(rt, "onFacesDetectedCv"));
events.setProperty(rt, "topCameraFrame", createDirectEvent(rt, "onCameraFrame"));
events.setProperty(rt, "topFrameSize", createDirectEvent(rt, "onFrameSize"));
return events;
}
};
} // namespace rnoh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/**
* This code was generated by "react-native codegen-lib-harmony"
*/

#include "CvCameraModule.h"

namespace rnoh {
using namespace facebook;

CvCameraModule::CvCameraModule(const ArkTSTurboModule::Context ctx, const std::string name) : ArkTSTurboModule(ctx, name) {
methodMap_ = {
ARK_METHOD_METADATA(setOverlay, 2),
ARK_ASYNC_METHOD_METADATA(takePicture, 2),
ARK_METHOD_METADATA(startRecording, 2),
ARK_ASYNC_METHOD_METADATA(stopRecording, 1),
};
}

} // namespace rnoh
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
/**
* This code was generated by "react-native codegen-lib-harmony"
*/

#pragma once

#include "RNOH/ArkTSTurboModule.h"

namespace rnoh {

class JSI_EXPORT CvCameraModule : public ArkTSTurboModule {
public:
CvCameraModule(const ArkTSTurboModule::Context ctx, const std::string name);
};

} // namespace rnoh
Loading