opencv – 青春部落,流年似水 http://www.youthtribe.com 青春是一场远行,总记不起来时的路。 Sat, 24 May 2014 03:58:42 +0000 zh-CN hourly 1 https://wordpress.org/?v=6.1.6 opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/1170 http://www.youthtribe.com/archives/1170#respond Mon, 12 May 2014 17:47:07 +0000 http://www.youthtribe.com/?p=1170 height/30; strName.Format("%d",kk); //得到每一位然后去涂。。。 int num1 = strName.GetAt(0)-48; int num2 = strName.GetAt(1) -48;]]> 压力测试图片生成代码



	IplImage * pImg = NULL; 

	CString strName;
	/*
	CvScalar s;
	s.val[0]=s.val[1]=s.val[2]=s.val[3]=0;//black
	//1111-9999
	
	for (int kk = 1111;kk<2999;kk++)
	{
		if(pImg != NULL)
			cvReleaseImage(&pImg);
		pImg =cvLoadImage( "压力测试专用文件夹\\75tv.jpg" , 1 ) ;
		float nwidth = (float)pImg->width/24;
		float nheight = (float)pImg->height/30;
		strName.Format("%d",kk);
		//得到每一位然后去涂。。。
		int num1 = strName.GetAt(0)-48;
		int num2 = strName.GetAt(1) -48;
		int num3 = strName.GetAt(2)-48;
		int num4 = strName.GetAt(3)-48;
		
		//3
		for (int x = 2*nwidth;x<3*nwidth;x++)
		{
			for (int y = (5+num1)*nheight;y<(5+num1+1)*nheight;y++)
			{
				cvSet2D(pImg,y,x,s);
			}	
			
			//strName.Format("压力测试专用文件夹\\%d.jpg",strName);
			//cvSaveImage (strName,pImg);
			
		}
		//4
		for (int x2 = 3*nwidth;x2<4*nwidth;x2++)
		{
			for (int y2 = (5+num2)*nheight;y2<(5+num2+1)*nheight;y2++)
			{
				cvSet2D(pImg,y2,x2,s);
			}	
			
			//strName.Format("压力测试专用文件夹\\%d.jpg",strName);
			//cvSaveImage (strName,pImg);
			
		}
		//5
		for (int x3 = 4*nwidth;x3<5*nwidth;x3++)
		{
			for (int y3 = (5+num3)*nheight;y3<(5+num3+1)*nheight;y3++)
			{
				cvSet2D(pImg,y3,x3,s);
			}	
			
			//strName.Format("压力测试专用文件夹\\%d.jpg",strName);
			//cvSaveImage (strName,pImg);
			
		}
		
		//6
		
		for (int x4 = 5*nwidth;x4<6*nwidth;x4++)
		{
			for (int y4 = (5+num4)*nheight;y4<(5+num4+1)*nheight;y4++)
			{
				cvSet2D(pImg,y4,x4,s);
			}	
			
			//strName.Format("压力测试专用文件夹\\%d.jpg",strName);
			//cvSaveImage (strName,pImg);
		
		}
		strName.Format("压力测试专用文件夹\\%d.jpg",kk);
		cvSaveImage (strName,pImg);	

	}
	*/
	//
	
	//再开始合成
	CvScalar s;
	s.val[0]=s.val[1]=s.val[2]=s.val[3]=255;//white
	IplImage * pOKImg = cvCreateImage(cvSize(800,600),8,1);
	for (int u =1111;u<2999;u++)
	{
		for (int a = 0;a<800;a++)
		{
			for (int b = 0;b<600;b++)
			{
				cvSet2D(pOKImg,b,a,s);
			}	
			

		}
		//加载图片
		CString strName;
		strName.Format("压力测试专用文件夹\\%d.jpg",u);
		IplImage * pImg = cvLoadImage(strName,0);
		CvScalar s2;
		for (int i = 0 ;iwidth;i++)
		{
			for (int j=0 ; jheight;j++)
			{
				s2=cvGet2D(pImg,j,i);
				cvSet2D(pOKImg,j+30,i+30,s2);
			}

		}
		strName.Format("C:\\Documents and Settings\\Administrator\\桌面\\压力测试用图片\\%d.jpg",u);
		cvSaveImage (strName,pOKImg);

	}
	

	/*
	for (int i = 0 ;i<3 ;i++)//行循环
	{

		for (int j = 0 ;j<9 ;j++)//列循环
		{
			for (int y = (6+j)*nheight;y<(6+j+1)*nheight;y++)
			{
				cvSet2D(pImg,y,x,s);
			}	
			
			for (int m = 0 ;m<9 ;m++)//列循环
			{
				for (int n = 0 ;n<9 ;n++)//列循环
				{
					
					for (int x = (3+i)*nwidth;x<(3+i+1)*nwidth;x++)
					{
						for (int y = (6+j)*nheight;y<(6+j+1)*nheight;y++)
						{
							cvSet2D(pImg,y,x,s);
						}	
						
						strName.Format("压力测试专用文件夹\\%d%d.jpg",i,j);
						cvSaveImage (strName,pImg);
						
					}

				}
			}


		}
	}
	*/




]]>
http://www.youthtribe.com/archives/1170/feed 0
opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/1106 http://www.youthtribe.com/archives/1106#respond Sun, 30 Mar 2014 02:57:23 +0000 http://www.youthtribe.com/?p=1106 因此我们可以总结以上实验的结果从而获得canny算子得实质:如果一个像素的梯度大与上限值,则被认为是边缘像素,如果小于下限阈值,则被抛弃,那么如果该店的梯度位于两者之间呢?则当其与高于上限值的像素点连接时我们才保留,否则删除。

 

这个解释得很清楚,以备自查

片段链接来自:http://zhuyuge0.blog.163.com/blog/static/13230361420116178512694/

]]>
http://www.youthtribe.com/archives/1106/feed 0
opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/1094 http://www.youthtribe.com/archives/1094#respond Tue, 11 Mar 2014 02:52:21 +0000 http://www.youthtribe.com/?p=1094 opencv 如何捕捉异常

try{
	//故意出错
}
catch(cv::Exception& e )
{
        const char * s_ERROR=e.what();
        AfxMessageBox(s_ERROR);
}
]]>
http://www.youthtribe.com/archives/1094/feed 0
opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/1005 http://www.youthtribe.com/archives/1005#comments Thu, 07 Nov 2013 11:18:03 +0000 http://www.youthtribe.com/?p=1005 因为opencv不支持阿尔法通道(也有的说最新版本的其实是支持了的,在此我不做肯定),但要是两张图片去叠加的话,其实还是可以简单实现透明叠加的,这也是制作水印图片的方法。
比如,我们把图片B叠加到图片A上.透明的实际效果就是既能看到A的内容,又能看到B的内容.

终值 = Va*(1-rank/10)+Vb*(rank/10)

///下边是关键代码,有注释

//先说一下,pimg是大图(也可以理解为背景图),watermarkpic是水印图片(你的水印logo,或者文字),是IplImage格式指针
//注意数组的越界问题,水印图片要比pimg的小才行的。如果大了,就缩小一下就可以了


		//把水印图片的像素值写到pImg的ROI中
		CvScalar scalar1,scalar2,scalar3;
		//透明度参数
		double dbAlpha;
                //1-10,0为不透明,10为透明(也就是不显示水印图片),所以实际值为1-9
		dbAlpha = 2;
		for (int i=0;iheight;i++)
		{
			for (int j=0;jwidth;j++)
			{
				//得到水印图片对应的值
				//这其实也可以设置一下透明度的 hyaline
				//scalar=cvGet2D(watermarkpic,i,j);//这行是完全不透明的语句
				scalar1 = cvGet2D(watermarkpic,i,j);//水印图片像素值
				scalar2 = cvGet2D(pImg,i,j);//pimg像素值
				for (int k =0;k<4;k++)
				{
                                        //开始赋值,也就是合成后图片对应的像素值
					scalar3.val[k] = scalar1.val[k]*(1-dbAlpha)+scalar2.val[k]*dbAlpha;

				}

				cvSet2D(pImg,i,j,scalar3);

			}
		}

下边附3张效果图:

opencv叠加透明效果图

opencv叠加透明效果图

opencv叠加透明效果图

最后,感谢美女范冰冰小姐的友情客串.
ps:图片来自截屏软件,就有添加透明水印的效果哦,可自定义水印位置哈:http://www.youthtribe.com/snapshot/

]]>
http://www.youthtribe.com/archives/1005/feed 1
opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/925 http://www.youthtribe.com/archives/925#respond Sun, 14 Jul 2013 05:59:51 +0000 http://www.youthtribe.com/?p=925 先上定义:

Dilate

使用任意结构元素膨胀图像

void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
src
输入图像.
dst
输出图像.
element
用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
iterations
膨胀的次数

函数 cvDilate 对输入图像使用指定的结构元进行膨胀,该结构决定每个具有最小值象素点的邻域形状:

dst=dilate(src,element):  dst(x,y)=max((x',y') in element))src(x+x',y+y')

函数支持(in-place)模式。膨胀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。

 

下边是程序:

// opencv_template.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h"
#include "opencv2/opencv.hpp"; 
#include "opencv/cv.h";

using namespace std; 
using namespace cv;

int _tmain(int argc, _TCHAR* argv[]) {  
//cout"""iam a boy"""endl;  
IplImage *img;  img=cvLoadImage("test.jpg",1);  
IplImage *newimg;  
newimg = cvCloneImage(img);

//开始膨胀  
cvDilate(img,newimg,NULL,3);  
//开始腐蚀  
//cvErode(img,newimg,NULL,3);

//开始显示图片  
cvNamedWindow("DilateBefore",CV_WINDOW_AUTOSIZE);  
cvNamedWindow("DilateAfter",CV_WINDOW_AUTOSIZE);  
cvShowImage("DilateBefore",img);  
cvSaveImage("new.jpg",newimg);  
cvShowImage("DilateAfter",newimg);  
cvWaitKey(0);  
//system("pause");  
return 0; 
}

 

 

]]>
http://www.youthtribe.com/archives/925/feed 0
opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/916 http://www.youthtribe.com/archives/916#respond Wed, 10 Jul 2013 14:06:51 +0000 http://www.youthtribe.com/?p=916 1.单击 项目 ,-〉你的工程名+属性-〉配置属性-〉VC++目录

在右侧显示的 常规中包含目录中 添加:你的opencv安装目录 \opencv2.4.4\opencv\build\include,你的opencv安装目录 \opencv2.4.4\opencv\build\include\opencv,你的opencv安装目录 \opencv2.4.4\opencv\build\include\opencv2,这三项

在库目录中添加 :

你的opencv安装目录opencv2.4.4\opencv\build\x86\vc10\lib

2在链接器-〉输入,右侧 附加依赖项 添加如下:

opencv_calib3d244d.lib opencv_contrib244d.lib opencv_core244d.lib opencv_features2d244d.lib opencv_flann244d.lib opencv_gpu244d.lib opencv_highgui244d.lib opencv_imgproc244d.lib opencv_legacy244d.lib opencv_ml244d.lib opencv_objdetect244d.lib opencv_ts244d.lib opencv_video244d.lib

(这些lib要成一行一行的加, 不然会有LINK : fatal error LNK1104: 无法打开文件”.obj”这个错误)

(注:最后带d的lib适合debug,244实际上是版本,为了方便调试 和发布,所以最好都添加吧)

3.在需要用到opencv的cpp文件中加入:

#include <opencv2/opencv.hpp>

#include <opencv/cv.h>

 

ok。这样好像就可以了。只适用于vc2010 之 cv++

]]>
http://www.youthtribe.com/archives/916/feed 0
opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/913 http://www.youthtribe.com/archives/913#comments Wed, 10 Jul 2013 13:49:41 +0000 http://www.youthtribe.com/?p=913 先来看opencv函数 cvHoughCircles 的说明:

函数:CvSeq *cvHoughCircles(CvArr *image,void *circle_storage,int method,double dp,double min_dist,double param1,double param2,int min_radius,int max_radius)

下边是参数说明:

image:输入8bit(灰度)图像,其内容可被函数所改变
circle_storage:检测到的圆存储仓,可以是内存存储仓 (此种情况下,一个线段序列在存储仓中被创建,并且由函数返回)或者是包含圆参数的特殊类型的具有单行/单列的CV_32FC3型矩阵(CvMat*). 矩阵头为函数所修改,使得它的 cols/rows 将包含一组检测到的圆。如果 circle_storage 是矩阵,而实际圆的数目超过矩阵尺寸,那么最大可能数目的圆被返回,每个圆由三个浮点数表示:圆心坐标(x,y)和半径.).
method:Hough 变换方式,目前只支持CV_HOUGH_GRADIENT, which is basically 21HT, described in [Yuen03].
dp:寻找圆弧圆心的累计分辨率,这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。
min_dist:该参数是让算法能明显区分的两个不同圆之间的最小距离。
param1:用于Canny的边缘阀值上限,下限被置为上限的一半。
param2:累加器的阀值。
The second method-specific parameter. In case of CV_HOUGH_GRADIENT it is accumulator threshold at the center detection stage. The smaller it is, the more false circles may be detected. Circles, corresponding to the larger accumulator values, will be returned first.
min_radius:最小圆半径。
max_radius:最大圆半径。
]]>
http://www.youthtribe.com/archives/913/feed 1
opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/856 http://www.youthtribe.com/archives/856#respond Fri, 03 May 2013 07:52:40 +0000 http://www.shizhiyou.com/blog/?p=856 cvThreshold
cvThreshold是opencv库中的一个函数
作用:函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。本函数支持的对图像取阈值的方法由 threshold_type 确定。
形式:void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
src:原始数组 (单通道 , 8-bit of 32-bit 浮点数)。dst:输出数组,必须与 src 的类型一致,或者为 8-bit。
threshold:阈值
max_value:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。
threshold_type:阈值类型 threshold_type=CV_THRESH_BINARY:
如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0;
threshold_type=CV_THRESH_BINARY_INV:
如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.
threshold_typ
]]>
http://www.youthtribe.com/archives/856/feed 0
opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/852 http://www.youthtribe.com/archives/852#respond Thu, 02 May 2013 06:48:57 +0000 http://www.shizhiyou.com/blog/?p=852 Mat是opencv2.0推出的处理图像的新的数据结构,现在越来越有趋势取代之前的cvMat和lplImage,相比之下Mat最大的好处就是能够更加方便的进行内存管理,不再需要程序员手动管理内存的释放。opencv2.3中提到Mat是一个多维的密集数据数组,可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。

class CV_EXPORTS Mat
{

public:




int flags;(Note :目前还不知道flags做什么用的)
int dims; 
int rows,cols; 
uchar *data; 
int * refcount; 
...

};


 从以上结构体可以看出Mat也是一个矩阵头,默认不分配内存,只是指向一块内存(注意读写保护)。初始化使用create函数或者Mat构造函数,以下整理自opencv2.3.1 Manual:
Mat(nrows, ncols, type, fillValue]); 
M.create(nrows, ncols, type);
例子:
Mat M(7,7,CV_32FC2,Scalar(1,3)); 
M.create(100, 60, CV_8UC(15));

int sz[] = {100, 100, 100}; 
Mat bigCube(3, sz, CV_8U, Scalar:all(0));

double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};
Mat M = Mat(3, 3, CV_64F, m).inv();

Mat img(Size(320,240),CV_8UC3); 
Mat img(height, width, CV_8UC3, pixels, step);

IplImage* img = cvLoadImage("greatwave.jpg", 1);
Mat mtx(img,0); // convert IplImage* -> Mat;
访问Mat的数据元素:
Mat M;
M.row(3) = M.row(3) + M.row(5) * 3; 


Mat M1 = M.col(1);
M.col(7).copyTo(M1); 


Mat M;
M.at<double>(i,j); 
M.at(uchar)(i,j); 
Vec3i bgr1 = M.at(Vec3b)(i,j) 
Vec3s bgr2 = M.at(Vec3s)(i,j) 
Vec3w bgr3 = M.at(Vec3w)(i,j) 


double sum = 0.0f;
for(int row = 0; row < M.rows; row++)
{ 
const double * Mi = M.ptr<double>(row); 
for (int col = 0; col < M.cols; col++) 
sum += std::max(Mi[j], 0.);
}


double sum=0;
MatConstIterator<double> it = M.begin<double>(), it_end = M.end<double>();
for(; it != it_end; ++it) 
sum += std::max(*it, 0.);
Mat可进行Matlab风格的矩阵操作,如初始化的时候可以用initializers,zeros(), ones(), eye(). 除以上内容之外,Mat还有有3个重要的方法:
Mat mat = imread(const String* filename); // 读取图像
imshow(const string frameName, InputArray mat); // 显示图像
imwrite (const string& filename, InputArray img); //储存图像

CvMat, Mat, IplImage之间的互相转换

IpIImage -> CvMat

CvMat matheader;
CvMat * mat = cvGetMat(img, &matheader);

CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3);
cvConvert(img, mat)


IplImage -> Mat
Mat::Mat(const IplImage* img, bool copyData=false);
例子:
IplImage* iplImg = cvLoadImage("greatwave.jpg", 1);
Mat mtx(iplImg);

 

Mat -> IplImage
Mat M
IplImage iplimage = M;

CvMat -> Mat
Mat::Mat(const CvMat* m, bool copyData=false);

Mat -> CvMat
例子(假设Mat类型的imgMat图像数据存在):
CvMat cvMat = imgMat;/*Mat -> CvMat, 类似转换到IplImage,不复制数据只创建矩阵头

]]>
http://www.youthtribe.com/archives/852/feed 0
opencv – 青春部落,流年似水 http://www.youthtribe.com/archives/849 http://www.youthtribe.com/archives/849#respond Thu, 02 May 2013 06:18:35 +0000 http://www.shizhiyou.com/blog/?p=849 opencv1.x 版本和新版本 2.X.x的一些大的区别:

1. 首先,新的版本几乎完全向下兼容,变化主要体现现在:
a. 增加新的/优化的算法实现。(不多,因为图像处理经典的算法就那么多)
b. 对多语言/平台的支持,比如python, c++,android。这与现在的商业应用有关。
c. 文件命名规则发生了一些变化,比如现在的库统一为opencv_xxxxx.lib,加了前缀。(仅举例,可能还有别的)
d. 数据结构发生了变化。2.0以后,提倡使用Mat 结构,来代替以前的IplImage,Array。结构跟易于使用。(仅举例,可能还有别的)
e. 目录结构发生了变化,opencv opencv2,你观察一下就知道了。对旧的代码,要设置好inlucde路径。

2. 是否需要下载新的版本,取决你的情况。
a. 研究学习(在校学生)的话,个人觉得越新越好。代价是一些旧的代码可能需要多花些时间调试(学生多是这种需求吧? :-D)。
b. 项目开发的话,如果你不是决策者,就无须担忧这个问题。会有人决定的。——看问题,你应该不是。

3. 使用c风格还是c++风格:
a. 其实opencv对待c 与c++,如同对待c与python一样,分别提供了不同的API,完全独立。只是因为c与c++的关系,两者才显得纠结不清。
b. 使用谁完全取决于你。c++的语法相对宽松,接口简单,易于使用。c的已有代码、资料会多一些。——一般来说,是会混用的。:-D 因为大多数程序员都分不清c与c++的区别。
c. 简单说,就是不用纠结这个问题,把功能实现即可。

个人的一些浅薄简介,希望能帮到你。也是刚开始使用OpenCV。

整理自:http://www.opencv.org.cn/forum

]]>
http://www.youthtribe.com/archives/849/feed 0