本文是我在用opencv编程中遇到的一些问题总结,现记录下来希望对大家有用。本文我会在以后的编程的不断更新。
1 要特别注意在函数中使用局部IplImage的问题
当频繁调用函数是,如果函数中局部IplImag变量,那么程序运行时可能会出错,即使在函数中释放了局部IplImage的空间也会出错。这应该是opencv不完美的地方,要特别注意。
2 在MFC中使用opencv时,最好不使用Unicode字符集,下面是原因及不使用Unicode的方法
点击OK -- Next进入下一步,在这里我们创建一个Dialog-based Application,大部分选项按默 认设置就行,不过最下面的“Use Unicode libraries”最好去掉。如果勾选了这个选项,程序代码就会使用16bit的Unicode字符集来编码,但是很多函数虽然使用 char* (ASCII stings) 类型字符,而将字符串从Unicode 转换到 ASCII 是非常麻烦的。使用Unicode 在编译时可能会遇到下列错误
cannot convert parameter 1from 'CString' to 'const char *'
cannot?convert?from?'const?char?[11]'?to?'LPCWSTR'
如果觉得转换麻烦的话,可以直接在新建工程时不选用Unicode Libraries,或者工程中修改 Project->Property->Configuration Properties->General->Project Defaults->Character Set,改为Use Multi-Byte Character Set。(此界面 alt+F7可以直接打开)
3 注意cvLoadImage函数中的第二个参数,当写的opencv程序比较多的时候会发现第二个参数要非常小心的使用。
IplImage* cvLoadImage( const char* filename, int iscolor=1 );
filename 要被读入的文件的文件名。
iscolor 指定读入图像的颜色:
如果 >0,读入的图像将被强制转换为3 通道彩色图像;
如果为 0, 读入的将被强制转换为灰度图像;
如果 <0, 读入的图像将与它本来颜色信息一样 (颜色通道数目由图像文件决定)
4 UpdateData(true) 用窗体上控件中的内容来更新和控件相关连的变量的值(只能更新value类型的变量)
UpdateData(false);
和上面的正好相反,还是以上面的Edit为例,当你在程序中改变了m_strName变量的内容的时候,如果你想让那个Edit也显示更新后的m_strName,就必须调用UpdateData(false);
这样在你的Edit中才能显示更新完的变量的值!
5 CV_MAT_ELEM(*mean,float,0,i) 要注意此处的*
6 cvCvtColor(img,gray_img,CV_RGB2GRAY); CV_BGR2GRAY
7 void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL);
Copies one array to another.
src//The source array
dst//The destination array
mask
//Operation mask, 8-bit single channel array; specifies elements of the destination array to
be changed
注意使用mask作用会很方便
8 #pragma region #pragma endregion
9 CString和string的互相转换
CString->std::string 例子:
CString strMfc=“test“;
std::string strStl;
strStl=strMfc.GetBuffer(0);
std::string->CString 例子:
CString strMfc;
std::string strStl=“test“;
strMfc=strStl.c_str();
例如有
CString str;
转换时用(const char*)(LPCTSTR)str
(const char*)videoPath.GetBuffer()
对于 vc++:其他的数据类型转化为string可以用 string.format("%dfcs",....)的形式
s3 = format("%s af",aa);
10 读取图片像素的两种方法
1) pixel = CV_IMAGE_ELEM(img,uchar,m,n);
2)用指针uchar* data = (uchar*)(img->imageData);
11 SetDlgItemText(IDC_EDIT13,str); 单独给edit控件赋值
12 cvConvert (frame, tmp_img);
注意此函数可以把IplImage中的元素从一种数据类型转化到另外一种数据类型,这点很有用。比如在程序中,你可以会把iplimage中数据类型转化为double,但最后若要保存改图片就要把它转化为整型,此时就可以用这个函数。
cvConvert(src,dst);//把src转换为dst中定义的数据类型,注意通道类型要一样。