android opencv rgb到hsv

时间:2011-10-25 13:30:11

标签: android opencv

如何将rgb转换为hsv并在opencv for the screen中使用hsv显示在屏幕上?

using namespace std;
using namespace cv;

extern "C" {
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial3_Sample3View_FindFeatures(JNIEnv* env, jobject thiz, jint width, jint height, jbyteArray yuv, jintArray bgra)
{
    jbyte* _yuv  = env->GetByteArrayElements(yuv, 0);
    jint*  _bgra = env->GetIntArrayElements(bgra, 0);

    Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv);
    Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);
    Mat mgray(height, width, CV_8UC1, (unsigned char *)_yuv);


    //Please make attention about BGRA byte order
    //ARGB stored in java as int array becomes BGRA at native level
    cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);





    env->ReleaseIntArrayElements(bgra, _bgra, 0);
    env->ReleaseByteArrayElements(yuv, _yuv, 0);
}

}

以上代码从相机输入yuv并转换为rgb。我知道我需要使用cvtColor函数将rgb转换为hsv但是hsv的Mat应该具有哪些参数?以及如何让它显示而不是rgb

2 个答案:

答案 0 :(得分:4)

如果您想将RGB Mat图像转换为HSV色彩空间,您可以这样做:

Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2HSV, 3); //3 is HSV Channel

在Android屏幕中显示之前,您需要将HSV从3频道转换为4频道,因为Android无法在3频道中显示Mat。有关详细信息,请参阅this。像这样的代码:

Imgproc.cvtColor(dst, src, Imgproc.COLOR_HSV2RGBA, 4); // 4 is RGBA Channel

答案 1 :(得分:1)

对于HSV,您应该使用8位无符号。我想你的问题是Hue(理论上它应该在0到360之间,但在openCV Hue中表示的是0,180区间。

如何看待这一点:我将3个通道(H,S,V)中的每一个视为灰色图像。最后,即使在变换后图像也是一样的,只是表示图像的方式也不同。