关于opencv编程get到两个小技巧
2017-01-14 23:12
267 查看
今天看代码,get到两个小技巧,因为最近写程序也在用,所以很开森
1.读按一定规则命名的图像序列
以前是这样子读的:
今天学到了这样读:
感觉是简便多了,主要还是没理解sprintf函数的精髓啊
2.在二值图像中,如果背景是白色,图案是黑色,要取出黑色区域的边框
tip1:
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);
效果图:
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);
效果图:
相关文章推荐
- "getline" bug fix for Microsoft Visual C++ 6.0 关于VC6的getline输入需要两个回车才结束的BUG修改方法
- 关于DSP/BIOS的编程的两个问题
- VB编程的一些小技巧 - 关于vb字符串操作的优化
- 关于DSP/BIOS的编程的CMD文件不能修改的两个问题 .
- 【C#】开发的两个基本编程原则的深入讨论--为什么要用get,set,直接用public string Name不行吗
- 关于cocos2d-x编程的一些小技巧
- 关于Opencv编程入门的基础知识点
- 编程世界里关于两个数值大小的有趣比较
- 几个编程小技巧 关于 Delphi7_Lite_Full_Edition_Setup_7.3.4.3_Build_20110801
- 编程经验:关于OpenCV源码调试的好文章转载~
- OpenCV和关于VS平台的一些编程总结
- C# Tips:关于类的集合属性的编程小技巧
- 关于《JavaScript DOM 编程艺术》一书中getHTTPObject.js 的一点看法
- SybaseASE中关于触发器使用的两个小技巧
- flex 关于布局控制的两个小技巧
- 编程经验:关于OpenCV源码调试的好文章转载~
- 关于openCV getRotationMatrix2D 函数中平移向量的理解
- 两个硬盘和文件相关的小技巧
- Vbscript 脚本编程3 关于文件的读写
- 关于http://support.microsoft.com/default.aspx?scid=kb;EN-US;309158的GetUpperBound(0)