今天看代码,get到两个小技巧,因为最近写程序也在用,所以很开森
1.读按一定规则命名的图像序列
以前是这样子读的:
int i;
//图像命名规则是frame*.png,*代表编号,0,1,2....
string path = "E:\\images\\frame";
char str[5];
Mat image;
for(i=0;i<100;i++)
{
sprintf(str,"%d",i);
path += str;
path += ".png";
image = imread(path);
}
今天学到了这样读:
int i;
char filePath[200];
char basePath[100] = "E:\\images\\frame";
Mat image;
for(i=0;i<200;i++)
{
sprintf(filePath,"%s%d.png",basePath,i);
image = imread(filePath);
}
感觉是简便多了,主要还是没理解sprintf函数的精髓啊
2.在二值图像中,如果背景是白色,图案是黑色,要取出黑色区域的边框
tip1:
Rect calcRoi(Mat &image)
{
int minx,maxx,miny,maxy;
int width = image.cols;
int height = image.rows;
int i;
//找到边框的左边界
for(i=0;i<width;i++)
{
Mat colImg = image.col(i);
int num = countNonZero(colImg);
if(num < height)
{
minx = i;
break;
}
}
//寻找右边界
for(i=width-1;i>=0;i--)
{
Mat colImg = image.col(i);
int num = countNonZero(colImg);
if(num < height)
{
maxx = i;
break;
}
}
//上边界
for(i=0;i<height;i++)
{
Mat rowImg = image.row(i);
int num = countNonZero(rowImg);
if(num < width)
{
miny = i;
break;
}
}
//下边界
for(i=height-1;i>=0;i--)
{
Mat rowImg = image.row(i);
int num = countNonZero(rowImg);
if(num < width)
{
maxy = i;
break;
}
}
Rect roiRect = Rect(minx,miny,maxx-minx,maxy-miny);
return roiRect;
}
tip2:
Mat image = imread("test.png",0);
int left,right,top,bottom;
left = image.cols;
right = 0;
top = image.rows;
bottom = 0;
int i,j;
for(i=0;i<image.rows;i++)
{
for(j=0;j<image.cols;j++)
{
if(image.at<uchar>(i,j) > 0)
{
if(j < left) left = j;
if(j>right) right = j;
if(i < top) top = i;
if(i > bottom) bottom = i;
}
}
}
Rect roi(left,top,right-left,bottom-top);
rectangle(image,roi,Scalar(255),1);
imshow("image",image);
waitKey(0);
效果图: