Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenCV imwrite,颜色是错误的:我应该使用convertTo/cvColor的哪个参数?_Android_Opencv_Java Native Interface - Fatal编程技术网

Android OpenCV imwrite,颜色是错误的:我应该使用convertTo/cvColor的哪个参数?

Android OpenCV imwrite,颜色是错误的:我应该使用convertTo/cvColor的哪个参数?,android,opencv,java-native-interface,Android,Opencv,Java Native Interface,好吧,我一直在网上搜索,但我找不到这个 我有: OpenCV4Android,我正在混合使用:Java和本机 用金属制成的垫子 capture.retrieve(mFrame,Highgui.CV\u CAP\u ANDROID\u COLOR\u FRAME\u RGBA) 这不能更改为本机,因为它是其他人的库,并且完全以非本机方式构建 通过使用mFrame.nativeObj并使用以下方法传递此Mat的本机方法: JNIEXPORT int JNICALL Java_com_... ( ..

好吧,我一直在网上搜索,但我找不到这个

我有:

  • OpenCV4Android,我正在混合使用:Java和本机
  • 用金属制成的垫子

    capture.retrieve(mFrame,Highgui.CV\u CAP\u ANDROID\u COLOR\u FRAME\u RGBA)

  • 这不能更改为本机,因为它是其他人的库,并且完全以非本机方式构建

  • 通过使用
    mFrame.nativeObj
    并使用以下方法传递此Mat的本机方法:

    JNIEXPORT int JNICALL Java_com_... ( ...jlong addr ... )
    {
    
        Mat& mrgba = *((Mat*)addr);
    
        // do stuff
    
        imwrite( mrgba, ... );
    }
    
  • 现在。。。我使用这个矩阵,然后用
    imwrite
    编写它,所有这些都在本机部分中。虽然imwrite确实编写了一个文件,但它的颜色都是错误的。红色代表白色,绿色代表黑色,紫色代表我桌子的颜色,即淡黄色。现在,与其盲目地尝试
    cvColor
    convertTo
    ,我宁愿知道一些东西

    对于第一次检索到的帧,我应该知道多少个通道、类型、通道顺序等等

    capture.retrieve(mFrame, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
    
    然后通过JNI传输到本机OpenCV?实际上,我需要进行哪些转换才能使本机imwrite正常工作?

    试试看

    capture.retrieve(mFrame, Highgui.CV_CAP_ANDROID_COLOR_FRAME_BGRA);
    

    因为OpenCV使用蓝色、绿色和红色通道而不是红色、绿色、蓝色通道读取图像。

    出于某种原因,使用

    capture.retrieve(mFrame, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
    
    需要这样转换:

    cvtColor(mrgba, mbgr, CV_YCrCb2RGB, 4);
    
    以便
    imwrite
    将图像正确输出到SD卡


    我不明白为什么(
    imwrite
    应该接受BGR图像),但至少这回答了我的问题。

    我不想这样做。然而,如果我这样做了,imwrite写的图像都是绿色的,没有红色或蓝色。(当然,活动中的显示也有错误的颜色。)很难从帧中猜出频道顺序…但是根据文档,OpenCV总是以BGR顺序读取图像…因此您可以使用cvtColor()进行播放一旦你得到了想要的结果,你可以试着解释它,以便更好地理解…我尝试了各种转换,但都不起作用,因此这里的问题。我不打算盲目地尝试cvtColor的所有组合,除非没有其他选择。