判断图片是否加载成功
学习图像处理第一步就是载入图片,有时候路径错误或者图片不存在,需要判断是否载入成功。
方法一:通过判断Mat 类对象的 empty(),如果数组中没有elements,则返回 true。
int main()
{
Mat srcImage;
srcImage= imread("D:/Lena.jpg");
//数组有没有 elemens,则返回 true
if (srcImage.empty())
{
cout<< "could not load the Image!"<<endl;
return -1;
}
namedWindow("Lena");
imshow("Lena",srcImage);
waitKey(0);
return 0;
}
方法二:如果图像加载成功,则Mat 类对象的成员函数 data 中不为 0。
int main()
{
Mat srcImage;
srcImage= imread("D:/Lena.jpg");
//数组有没有 elemens,则返回 false
if (!srcImage.data)
{
cout<< "could not load the Image!"<<endl;
return -1;
}
namedWindow("Lena");
imshow("Lena",srcImage);
waitKey(0);
return 0;
}
绘制矩形的两种方法
刚开始学习时候,只知道一种对角点绘制办法,还有一种点(左上角)和宽、高的方法。
int main()
{
Mat srcImage;
srcImage= imread("D:/Lena.jpg");
//数组有没有 elemens,则返回 false
if (!srcImage.data)
{
cout<< "could not load the Image!"<<endl;
return -1;
}
//对角点画矩形
rectangle(srcImage,Point(srcImage.cols / 4,srcImage.rows / 4),Point(srcImage.cols*3/4 ,srcImage.rows*3 / 4),Scalar(255,0,0),2,LINE_8,0);
//一点两线画矩形
rectangle(srcImage,Rect(srcImage.cols / 2,srcImage.rows / 2,srcImage.cols /4,srcImage.rows /4),Scalar(0,255,0),2,LINE_AA,0);
namedWindow("Lena");
imshow("Lena",srcImage);
waitKey(0);
return 0;
}
注意:一点两线绘制矩形,点必须是左上角的点的坐标。
Rect box;
box.x = srcImage.cols / 2;
box.y = srcImage.rows / 2;
box.width = srcImage.cols /4;
box.height = srcImage.rows /4;
rectangle(srcImage,box,Scalar(0,255,0),2,LINE_AA,0);
waitkey()介绍
WaitKey(int delay) 指延时delay ms的时间。
在图像显示中,在函数imshow()后边加上 waitkey(0),表示程序停在此处等待,delay>0时,延迟"delay"ms,在显示视频时这个函数是有用的,用于设置在显示完一帧图像后程序等待"delay"ms再显示下一帧视频;如果使用cvWaitKey(0)则只会显示第一帧视频。
在写鼠标操作程序中,部分程序如下
while(1)
{
srcImage.copyTo(tempImage);
if(g_bDrawingBox) DrawRectangle(tempImage,g_rectangle);
imshow(WINDOW_NAME,tempImage);
waitKey(30);//没有加这个语句
}
没有添加waitKey这个语句,导致图像的显示不正常(在图像上,鼠标一直转圈圈)。可能 是显示太快了,没有延时一段时间。