原型:
Mat imread(const string& filename, int flags=1);
参数:
返回一个Mat类,所以用来读取图片
如:
Mat image0=imread("1.jpg",2|4); //无损
Mat image1=imread("1.jpg",0); //灰度
Mat image2=imread("1.jpg",666); //三通道彩色
image.data
是指向数据的指针,如果没有数据的话,那么指针就是空的。
// 检测是否读取成功
if(!image.data)
{
printf("loading error\n");
return 0;
}
bool cv::Mat::empty()
如果为空,返回true。
例如:
if (image.empty())
{
printf("loading error\n");
return 0;
}
原型:
void imshow(const String &winname, InputArray mat)
参数:
如:
imshow("hello",image0);
PS
它本身就可以创建窗口,所以一般不用namedWindow()就ok。(此时的图像不可自己拉伸)
但如果你有特殊要求的话,才和namedWindow()结合。
比如:你要自己的图像可以拉伸
namedWindow("Name",WINDOW_NORMAL);
imshow("Name",dstImage);
//名字要一致,这样imshow就不会创建新的窗口,而是使用nameWindow()创建的窗口
一定要加waitKey();不然不会显示出图片
#include
#include
using namespace cv;
using namespace std;
int main()
{
Mat tree = imread("./tree.jpg");
// 检测是否读取成功
if( !tree.data ){
printf("error\n");
return 0;
}
imshow("tree",tree);
waitKey();
}
原型:
bool imwrite(
const String &filename,
InputArray img,
const vecotr<int> ¶ms=vector<int>
);
参数:
并不可以直接进行格式转化,jpg→png是失败的
Mat srcImage=imread("3.jpg");
imwrite("3-png.png",srcImage);
//3-png.png出来没用,虽然后缀是png,但其实不是。
同尺寸的图片才能混合
原型
void addWeighted(
InputArray src1,
double alpha,
InputArrary src2,
double beta,
double gamma,
OutputArray dst,
int dtype=-1
);
参数
参数内部关系
d s t = s r c 1 [ I ] ∗ a l p h a + s r c 2 [ I ] ∗ b e t a + g a m m a dst=src1[I]*alpha+src2[I]*beta+gamma dst=src1[I]∗alpha+src2[I]∗beta+gamma
整体线性混合
#include
using namespace cv;
int main()
{
Mat backImage=imread("11.jpg");
Mat logoImage=imread("12.jpg");
Mat dstImage;
addWeighted(backImage,0.5,logoImage,0.5,0.0,dstImage);
imshow("11.jpg",backImage);
imshow("12.jpg",logoImage);
imshow("Effect",dstImage);
waitKey();
return 0;
}
局部线性混合
#include
using namespace cv;
int main()
{
Mat backImage=imread("12.jpg");
Mat logoImage=imread("5.jpg");
Mat ROI=backImage(Rect(0,0,logoImage.cols,logoImage.rows));
addWeighted(ROI,0.5,logoImage,0.3,0.0,ROI);
imshow("Effect",backImage);
waitKey();
return 0;
}
namedWindow()
原型:
void namedWindow(
const string &winname,
int flags=WINDOW_AUTOSIZE
);
参数:
PS:
这个窗口可以提供给imshow()使用,完成特定的窗口要求。上面已经讲过了。
void destroyWindow(const String &winname)
或者
void destroyAllWindows()
原型:
int waitKey(int delay=0)
参数;
返回值是按下按键的码(Esc的码是27),或者返回-1(没有按键被按下)。注意它只返回一次。
如
waitKey(); //一直等待
if(waitKey()=27) return 0;
cout<<"Just One";
//如果你按下ABCD,按完A就输出Just One了。并不是一直等待。
while(1){
if(waitKey()==27) break;
}
//这样不按Esc,就永远不会退出
OpenCV滑动条
OpenCV之鼠标