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

来源:互联网 发布:java经典实例 第三版 编辑:程序博客网 时间:2024/06/01 22:48

今天看代码,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);

效果图:



0 0
原创粉丝点击