OpenCV读写图像

628 阅读2分钟

OpenCV读写图像

想要完整全面地学习opencv,仅凭阅读samples的示例源码是不够的。毕竟opencv是一个拥有非常多函数的程序库,所以在每学习一个函数时,觉得有必要记录下来,

C++定义参数说明
IMREAD_UNCHANGED-1返回原始图像。alpha通道不会被忽略,如果有的。
IMREAD_GRAYSCALE0返回灰度图像
IMREAD_COLOR1返回通道顺序为BGR的彩色图像
IMREAD_ANYDEPTH2当输入具有相应的深度时返回16位/ 32位图像,否则将其转换为8位。
IMREAD_ANYCOLOR4则以任何可能的颜色格式读取图像。
IMREAD_LOAD_GDAL8使用GDAL的驱动加载图像。
IMREAD_REDUCED_GRAYSCALE_216将图像转换为单通道灰度图像,图像大小减少1/2。
IMREAD_REDUCED_COLOR_217转换图像的3通道BGR彩色图像和图像的大小减少1/2。
IMREAD_REDUCED_GRAYSCALE_432将图像转换为单通道灰度图像,图像大小减少1/4。
IMREAD_REDUCED_COLOR_433转换图像的3通道BGR彩色图像和图像的大小减少1/4。
IMREAD_REDUCED_GRAYSCALE_864将图像转换为单通道灰度图像,图像大小减少1/8。
IMREAD_REDUCED_COLOR_865转换图像的3通道BGR色彩图像和图像大小减少1/8。
IMREAD_IGNORE_ORIENTATION128不旋转图像根据EXIF的定位标志。

imread函数和imwrite函数在安卓中的使用

编写带有native声明的方法的Java类(java文件)或者编写带有external声明的方法的kotlin类(Kt文件)

/**
* fileName:文件路径
* flag:ImreadModes的编辑,返回图片类型
* bitmap:当前bitmap
*/
external fun imgRead(fileName: String, flag: Int, bitmap: Bitmap): Bitmap
/**
* fileName:存储文件的路径
* bitmap:当前bitmap
*/
external fun imgWrite(fileName: String, bitmap: Bitmap?): Boolean


//复制了部分代码
JNIEXPORT jobject JNICALL
JNI_API(imgRead)(JNIEnv *env, jobject type, jstring filename, jint flag, jobject bitmap) {
    const char *nativeScenePath = env->GetStringUTFChars(filename, 0);
    Mat src = imread(nativeScenePath, flag);
    MatToBitmap(env, src, bitmap, false);
    return bitmap;
}

JNIEXPORT jboolean JNICALL
JNI_API(imgWrite)(JNIEnv *env, jobject type, jstring filename, jobject bitmap) {
    const char *nativeScenePath = env->GetStringUTFChars(filename, 0);
    Mat src;
    BitmapToMat(env, bitmap, src);
    /**
     * 第一个参数const String& filename表示需要写入的文件名,必须要加上后缀,比如“123.png”。
     * 第二个参数InputArray img表示Mat类型的图像数据。
     * 第三个参数const std::vector& params表示为特定格式保存的参数编码
     */
    bool write = imwrite(nativeScenePath, src);
    return write;
}

cv2.imread():读入图片,共两个参数,第一个参数为要读入的图片文件名,第二个参数为如何读取图片 根据函数读取的Mat对象转化成bitmap,返回显示

cv2.imwrite():保存图片,共两个参数,第一个为保存文件名,第二个为读入图片

Mat和bitmap用C++互转就不在本文章提及了,可看www.jianshu.com/p/08dcc910b…