IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> react native 中使用OpenCV4.3.0,并实现inpaint -> 正文阅读

[人工智能]react native 中使用OpenCV4.3.0,并实现inpaint

1.【环境】

reactnative?0.62.0

react-native-opencv3 基础上做了修改,使用了4.3.0-contrib

com.quickbirdstudios:opencv:4.3.0-contrib

不要直接安装react-native-opencv3,因为只是在其基础上进行修改。从git上下载下代码

git clone?https://github.com/adamgf/react-native-opencv3.git

2.【遇到的相关问题】

? ? ? ? 1) 修改react-native-opencv3中的build.gradle,引用opencv4.3.0修改如下:

dependencies {
    implementation 'com.quickbirdstudios:opencv:4.3.0-contrib'
    implementation 'com.facebook.react:react-native:+'
}

? ? ? ? 2)针对react-native-opencv3中的各种bug的修复

? ? ? ? ? ? ? ? a).?react-native-opencv3中保存图像的错误修复

? ? ? ? ? ? ? ? ? ? ?新增如下方法:

@ReactMethod
    public void imwrite(String outPath, ReadableMap srcMat, final Promise promise) {
        int matIndex = srcMat.getInt("matIndex");
        Mat mat = (Mat) MatManager.getInstance().matAtIndex(matIndex);
        FileUtils.getInstance().imwrite(outPath, mat, promise);
    }
 public static void imwrite(final String outpath, final Mat dst, final Promise promise) {
        try {
            if (outpath == null || outpath.length() == 0) {
                // TODO: if no path sent in then auto-generate??!!!?
                rejectInvalidParam(promise, outpath);
                return;
            }

            Imgcodecs.imwrite(outpath, dst);

            WritableNativeMap result = new WritableNativeMap();
            result.putInt("width", new Double(dst.size().width).intValue());
            result.putInt("height", new Double(dst.size().height).intValue());
            result.putString("uri", outpath);

            promise.resolve(result);
        } catch (Exception ex) {
            ex.printStackTrace();
            reject(promise, "EGENERIC", ex);
        }
    }

? ? ? ? ? ? ? ? b). 原来的RNOpencv4Module.matToImage方法读取图片是24位4通道,在opencv中使用时多数情况都用不了,因此新增方法:

 @ReactMethod
    public void imageToMatWith16Bit3Channels(String inPath, final Promise promise) {
        FileUtils.getInstance().imageToMatWith16Bit3Channels(inPath, promise);
    }
public static void imageToMatWith16Bit3Channels(final String inPath,  final Promise promise) {
        try {
            if (inPath == null || inPath.length() == 0) {
                rejectInvalidParam(promise, inPath);
                return;
            }

            File inFileTest = new File(inPath);
            if (!inFileTest.exists()) {
                rejectFileNotFound(promise, inPath);
                return;
            }
            if (inFileTest.isDirectory()) {
                rejectFileIsDirectory(promise, inPath);
                return;
            }

            java.io.FileInputStream inx = null;
            ByteArrayOutputStream out = null;
            Mat p2 = null;
            try {
                inx = new java.io.FileInputStream(new java.io.File(inPath));
                out = new ByteArrayOutputStream();
                byte[] data = new byte[1024];
                int count = -1;
                while ((count = inx.read(data)) != -1) {
                    out.write(data, 0, count);
                }
                p2 = Imgcodecs.imdecode(new MatOfByte(out.toByteArray()), Imgcodecs.IMREAD_UNCHANGED);
            } catch(Exception e2){
                e2.printStackTrace();
            } finally {
                if (inx != null) {
                    try {
                        inx.close();
                    } catch (Exception ezz) {

                    }
                }
                if (out != null) {
                    try {
                        out.close();
                    } catch (Exception ezz) {
                    }
                }
            }

            int matIndex = MatManager.getInstance().addMat(p2);
            WritableNativeMap result = new WritableNativeMap();
            result.putInt("cols", p2.cols());
            result.putInt("rows", p2.rows());
            result.putInt("matIndex", matIndex);
            promise.resolve(result);
        } catch (Exception ex) {
            reject(promise, "EGENERIC", ex);
        }
    }

? ? ? ? ? ? ? ? c). 对inpain函数的支持,新增类:CvPhotoModule.java,代码如下:


public class CvPhotoModule extends ReactContextBaseJavaModule {

    private static final String TAG = CvPhotoModule.class.getSimpleName();

    public CvPhotoModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "CvPhoto";
    }

    @ReactMethod
    public void inpaint(final ReadableMap sourceMat, final ReadableMap maskMat, final ReadableMap destMat,final double inpaintRadius,final int flags, final Promise promise) {
        try {
            int matIndex = sourceMat.getInt("matIndex");
            Mat srMat = (Mat) MatManager.getInstance().matAtIndex(matIndex);
            matIndex = maskMat.getInt("matIndex");
            Mat maskBGR = (Mat) MatManager.getInstance().matAtIndex(matIndex);
            matIndex = destMat.getInt("matIndex");
            Mat dtMat = (Mat) MatManager.getInstance().matAtIndex(matIndex);
            Photo.inpaint(srMat, maskBGR, dtMat, inpaintRadius, flags);
            promise.resolve("ok");
        }catch(Exception e) {
            e.printStackTrace();
            promise.reject(null, e.getMessage());
        }
    }
}

? ? ? ? ? ? ? ? d). 新增绘制矩形方法,代码如下:

package com.huxg.opencv4bridge;

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.uimanager.UIBlock;

import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;

public class CvImgprocModule extends ReactContextBaseJavaModule {

    private static final String TAG = CvImgprocModule.class.getSimpleName();

    public CvImgprocModule(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    @Override
    public String getName() {
        return "CvImgproc";
    }

    @ReactMethod
    public void drawRectangle(final ReadableMap matMap, final ReadableMap rectMap, final ReadableMap colorMap,  final Promise promise) {
        try {
            int matIndex = matMap.getInt("matIndex");
            Mat mat = (Mat) MatManager.getInstance().matAtIndex(matIndex);

            int x = rectMap.getInt("left");
            int y = rectMap.getInt("top");
            int width = rectMap.getInt("width");
            int height = rectMap.getInt("height");
            Rect rect = new Rect(x, y, width, height);

            ReadableArray scalarVal = colorMap.getArray("vals");
            Scalar scalar = new Scalar(scalarVal.getDouble(0), scalarVal.getDouble(1), scalarVal.getDouble(2), scalarVal.getDouble(3));

            Imgproc.rectangle(mat, rect, scalar);

            MatManager.getInstance().setMat(matIndex, mat);
            promise.resolve("ok");
        }catch(Exception e) {
            promise.reject(null, e.getMessage());
        }
    }

    @ReactMethod
    public void drawBorderedRectangle(final ReadableMap matMap, final ReadableMap rectMap, final ReadableMap colorMap,  int thickness, final Promise promise) {
        try {
            int matIndex = matMap.getInt("matIndex");
            Mat mat = (Mat) MatManager.getInstance().matAtIndex(matIndex);

            int x = rectMap.getInt("left");
            int y = rectMap.getInt("top");
            int width = rectMap.getInt("width");
            int height = rectMap.getInt("height");
            Rect rect = new Rect(x, y, width, height);

            ReadableArray scalarVal = colorMap.getArray("vals");
            Scalar scalar = new Scalar(scalarVal.getDouble(0), scalarVal.getDouble(1), scalarVal.getDouble(2), scalarVal.getDouble(3));

            Imgproc.rectangle(mat, rect, scalar, thickness);

            MatManager.getInstance().setMat(matIndex, mat);
            promise.resolve("ok");
        }catch(Exception e) {
            promise.reject(null, e.getMessage());
        }
    }

    @ReactMethod
    public void drawSolidRectangle(final ReadableMap matMap, final ReadableMap rectMap, final ReadableMap colorMap, final Promise promise) {
        try {
            int matIndex = matMap.getInt("matIndex");
            Mat mat = (Mat) MatManager.getInstance().matAtIndex(matIndex);

            int x = rectMap.getInt("left");
            int y = rectMap.getInt("top");
            int width = rectMap.getInt("width");
            int height = rectMap.getInt("height");
            Rect rect = new Rect(x, y, width, height);

            ReadableArray scalarVal = colorMap.getArray("vals");
            Scalar scalar = new Scalar(scalarVal.getDouble(0), scalarVal.getDouble(1), scalarVal.getDouble(2), scalarVal.getDouble(3));

            Imgproc.rectangle(mat, rect, scalar, -1);

            MatManager.getInstance().setMat(matIndex, mat);
            promise.resolve("ok");
        }catch(Exception e) {
            promise.reject(null, e.getMessage());
        }
    }
}

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-09 10:14:30  更:2021-08-09 10:15:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 22:40:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码