图片颜色通道分离函数:
CV_EXPORTS void split(const Mat& src, Mat* mvbegin);
第一个参数:输入集合的引用
第二个参数:输出的的集合
代码如下:
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_splitMergePixels(JNIEnv *env, jclass type,
jintArray pixels_, jint w, jint h) {
jint *pixels = env->GetIntArrayElements(pixels_, NULL);
//颜色数据转换 ARGB的颜色数据被转成BGRA
Mat img(h,w,CV_8UC4,pixels);
//颜色通道分离split
vector<Mat> outImg;
//颜色通道分离处理,就是把图像蓝色、绿色、红色单独分离增强,并改变图像的色态,
split(img,outImg);
//增强基色色值,并不改变图片的轮廓形态
Mat& BMat = outImg.at(0);
//被分离的颜色的数据指针
uchar* b = BMat.ptr(0);
for(int i = 0;i < w*h;i++){
ptr[4*i+0] = b[i];//改变蓝色
ptr[4*i+1] = 0;
ptr[4*i+2] = 0;
}
int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result,0,size,pixels);
env->ReleaseIntArrayElements(pixels_, pixels, 0);
return result;
}
图像如下:
这里写图片描述
如何显示分离的绿色呢?
for(int i = 0;i < w*h;i++){
ptr[4*i+0] = 0;
ptr[4*i+1] = b[i];//改变绿色
ptr[4*i+2] = 0;
}
图像如下:
这里写图片描述
for(int i = 0;i < w*h;i++){
ptr[4*i+0] = 0;
ptr[4*i+1] = 0;
ptr[4*i+2] = b[i];//改变红色
}
如图所示
这里写图片描述
图片颜色合并函数:
CV_EXPORTS void merge(const Mat* mv, size_t count, OutputArray dst);
第一个参数:需要合并的数组
第二个参数:矩阵的计数
第三个参数:输出数组
CV_EXPORTS_W void merge(InputArrayOfArrays mv, OutputArray dst);
第一个参数:需要合并的数组
第二个参数:输出数组
代码如下:
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_xy_opencv_ndk_1opencv002_MainActivity_splitMergePixels(JNIEnv *env, jclass type,
jintArray pixels_, jint w, jint h) {
jint *pixels = env->GetIntArrayElements(pixels_, NULL);
//颜色数据转换 ARGB的颜色数据被转成BGRA
Mat img(h,w,CV_8UC4,pixels);
//颜色通道分离split
vector<Mat> outImg;
//颜色通道分离处理,就是把图像蓝色、绿色、红色单独分离增强,并改变图像的形态,
split(img,outImg);
//颜色合并处理,颜色合并成功后,原始图片不会有任何的变化。
merge(outImg,img);
int size = w * h;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result,0,size,pixels);
env->ReleaseIntArrayElements(pixels_, pixels, 0);
return result;
}
图片合并成功后,原始图片不会有任何的变化。
这里写图片描述
网友评论