1.多通道分离split()
void cv::split ( InputArray m,
OutputArrayOfArrays mv
)
m:待分离的多通道图像。
mv:分离后的单通道图像,为向量vector形式。
2.多通道合并merge()
void cv::merge ( InputArrayOfArrays mv,
OutputArray dst
)
mv:需要合并的图像向量vector,其中每个图像必须拥有相同的尺寸和数据类型。
dst: 合并后输出的图像,通道数等于所有输入图像的通道数总和。
3.Android jni demo
#include <jni.h> #include <string> #include <android/bitmap.h> #include <opencv2/opencv.hpp> #include <iostream> #include <android/log.h> #define LOG_TAG "xxx" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) using namespace cv; using namespace std; extern "C" JNIEXPORT void JNICALL Java_com_example_myapplication_MainActivity_opencv_1test(JNIEnv *env, jclass clazz, jobject bitmap) { AndroidBitmapInfo info; void *pixels; CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0); //判断图片是位图格式有RGB_565 、RGBA_8888 CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 || info.format == ANDROID_BITMAP_FORMAT_RGB_565); CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0); CV_Assert(pixels); //将bitmap转化为Mat类 Mat image(info.height, info.width, CV_8UC4, pixels); Mat imgs[4]; split(image,imgs); Mat img0,img1,img2,img3; img0=imgs[0]; img1=imgs[1]; img2=imgs[2]; img3=imgs[3]; Mat img_H; merge(imgs,4,img_H); imwrite("/sdcard/DCIM/img_H.jpg",img_H); Mat zero=Mat::zeros(Size(image.cols,image.rows),CV_8UC1); vector<Mat> imgsV; imgsV.push_back(img0); imgsV.push_back(img1); imgsV.push_back(img2); imgsV.push_back(img3); Mat imgsVH; merge(imgsV,imgsVH); imwrite("/sdcard/DCIM/imgsVH.jpg",imgsVH); }