您的位置:首页 > 编程语言

关于opencv编程get到两个小技巧

2017-01-14 23:12 267 查看
今天看代码,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);

效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: