加载图像(用cv::imread)
修改图像 (cv::cvtColor) 一个颜色空间转换到另一个颜色空间,颜色空间,肉眼看到的图像,其实是由很多单色组成 rgb crcb hsv HLS 颜色空间
把图像从一个彩色空间转换到另外一个色彩空间,有三个参数,第一个参数表示源图像、第二参数表示色彩空间转换之后的图像、第三个参数表示源和目标色彩空间如:COLOR_BGR2HLS 、COLOR_BGR2GRAY 等
保存图像(cv::imwrite)
只有8位、16位的PNG、JPG、Tiff文件格式而且是单通道或者三通道的BGR的图像才可以通过这种方式保存
保存PNG格式的时候可以保存透明通道的图片
可以指定压缩参数
RGB颜色空间的通道不是单一通道,有些颜色空间是单一通道。 实际上,三通道RGB的图像的顺序是 BGR
代码
windows:
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
void main(int argc, char ** argv)
{
/*
IMREAD_UNCHANGED (<0) 表示加载原图,不做任何改变
IMREAD_GRAYSCALE ( 0)表示把原图作为灰度图像加载进来
IMREAD_COLOR (>0) 表示把原图作为RGB图像加载进来,默认 3通道没有 alpha
*/
Mat src = imread("D:/opencv/images/test1.png", IMREAD_COLOR);//读取图片,OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载
if (src.empty())
{
printf("could not load image...\n");
return;
}
namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);//创建窗口,自动大小
imshow("test opencv setup", src);//显示图片,这个也会创建一个窗口,如果这个winname与上面窗口的winname不一致,会导致有两个窗口
//第二个窗口显示转换了颜色空间的图片
namedWindow("output windows", CV_WINDOW_AUTOSIZE);
Mat output;
//cvtColor(src, output, CV_BGR2GRAY);//RGB图像转换成灰度图,实际上,三通道RGB的图像的顺序是 BGR,所以 CV_BGR2GRAY 是BGR开头
//cvtColor(src, output, CV_BGR2HLS);//RGB图像转换成HLS颜色空间(专调亮度?),色相(H)、亮度(L)、饱和度(S)。 OpenCV提供转换的颜色空间还有其他很多,待研究..
cvtColor(src, output, CV_BGR2HSV);//RGB图像转换成HSV颜色空间(专调饱和度?),色调(色相)(H),饱和度(S),明度(亮度)(V)
imshow("output windows", output);//显示第二个图片
//保存图片
imwrite(getCVImagesPath("images_write/test1.tif"), output);//保存的图片的格式由给的字符串决定,给png就是png,jpg就是jpg,tif就是tif,write的结果:png比jpg大,tif几乎是原图大小
waitKey(0);//一检查到键盘活动就关闭,参数delay如果传0表示阻塞等待键盘事件,传大于0表示只阻塞等待多少毫秒,键盘无响应返回-1
}
android:
@BindView(R.id.iv_opencv1_2_origin) ImageView mOriginIv;
@BindView(R.id.iv_opencv1_2_convert) ImageView mConvertIv;
private Bitmap mOriginBmp;
private Bitmap mConvertBmp;
private Mat mOriginMat = new Mat();
private Mat mConvertMat = new Mat();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cv1_2);
mUnbinder = ButterKnife.bind(this);
mOriginBmp = CV310Utils.getBitmapFromAssets(this, "opencv/test1.png");
mConvertBmp = Bitmap.createBitmap(mOriginBmp.getWidth(), mOriginBmp.getHeight(), Bitmap.Config.RGB_565);
mOriginIv.setImageBitmap(mOriginBmp);
Utils.bitmapToMat(mOriginBmp, mOriginMat);
}
/*颜色空间转换*/
private void convertColor(int code) {
Imgproc.cvtColor(mOriginMat, mConvertMat, code);//mConvertMat对象输出图像的内存是自动分配的
Utils.matToBitmap(mConvertMat, mConvertBmp);
mConvertIv.setImageBitmap(mConvertBmp);
}
/*保存转换颜色空间后的mat图像到sdcard*/
private void imwrite(String fileName) {
String path = SDCardUtils.createNewFile(SDCardStoragePath.DEFAULT_OPENCV_SAVE_PATH, fileName).getAbsolutePath();
boolean is = Imgcodecs.imwrite(path, mConvertMat);//mConvertMat没有数据的时候,不会写入,返回false 若 path 文件不存在也会返回false
LogUtils.d("mydebug---", "is="+is+",path="+path);
}
@OnClick({R.id.btn_opencv1_2_convert_gray, R.id.btn_opencv1_2_convert_hls, R.id.btn_opencv1_2_convert_hsv, R.id.btn_opencv1_2_write_png,
R.id.btn_opencv1_2_write_jpg, R.id.btn_opencv1_2_write_tif})
void click(View view) {
switch (view.getId()) {
case R.id.btn_opencv1_2_convert_gray:
convertColor(Imgproc.COLOR_BGR2GRAY);//RGB图像转换成灰度图,实际上,三通道RGB的图像的顺序是 BGR,所以 COLOR_BGR2GRAY 是BGR开头
break;
case R.id.btn_opencv1_2_convert_hls:
convertColor(Imgproc.COLOR_BGR2HLS);//RGB图像转换成HLS颜色空间(专调亮度?),色相(H)、亮度(L)、饱和度(S)。 OpenCV提供转换的颜色空间还有其他很多,待研究..
break;
case R.id.btn_opencv1_2_convert_hsv:
convertColor(Imgproc.COLOR_BGR2HSV);//RGB图像转换成HSV颜色空间(专调饱和度?),色调(色相)(H),饱和度(S),明度(亮度)(V)
break;
case R.id.btn_opencv1_2_write_png:
imwrite("test1.png");//保存的图片的格式由给的字符串决定,给png就是png,jpg就是jpg,tif就是tif,write的结果:png比jpg大,tif几乎是原图大小
break;
case R.id.btn_opencv1_2_write_jpg:
imwrite("test1.jpg");
break;
case R.id.btn_opencv1_2_write_tif:
imwrite("test1.tif");//tif手机上不支持?
break;
}
}
截图