【不断更新贴】总结编程的技巧、语法等,需要多敲代码、记忆掌握

来源:互联网 发布:数控车床编程代码讲解 编辑:程序博客网 时间:2024/06/05 00:28
1. void DrawRectangle( cv::Mat& img, cv::Rect  box )
{
cv::rectangle(img,box.tl(),box.br(),cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255)));//随机颜色

}

注意: Rect类型可以直接通过Rect.tl()  Rect.br() 获取矩形的左上角、右下角坐标 

查看源码的定义:! the top-left corner
                         //Point_<_Tp> tl() const;
                        //! the bottom-right corner
                          //Point_<_Tp> br() const;


2.随机颜色: RNG   g_rng(12345);

cv::rectangle(img,box.tl(),box.br(),cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255)));//随机颜色

查看RNG源码:

/! returns uniformly distributed double-precision floating-point random number from [a,b) range
//double uniform(double a, double b);


3.深度复制MAT

     (1)Mat srcImage(600, 800,CV_8UC3), tempImage;
        srcImage.copyTo(tempImage);

      (2)Mat tempImage=srcImage.clone()


4.定义ROI区域

   Mat image=imread("~~~~");

  Mat imageROI=image(Rect(300,230,logo.cols,logo.rows));


5. convertScaleAbs  

使用线性变换转换输入数组元素成8位无符号整型。  convertScaleAbs( normImage, scaledImage );//将归一化后的图线性变换成8位无符号整型 

void cvConvertScaleAbs( const CvArr* src, CvArr* dst, double scale=1, double shift=0 );
#define cvCvtScaleAbs cvConvertScaleAbs
其中参数含义:
src : 原数组
dst :输出数组 (深度为 8u).
scale :比例因子.
shift :原数组元素按比例缩放后添加的值。
函数 cvConvertScaleAbs 与前一函数是相同的,但它是存贮变换结果的绝对值:
dst(I)=abs(src(I)*scale + (shift,shift,...))
函数只支持目标数数组的深度为 8u (8-bit 无符号) , 对于别的类型函数仿效于cvConvertScale 和 cvAbs 函数的联合 。

6.normalize
// 归一化与转换
normalize( dstImage, normImage, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );

函数原型:

    void normalize(InputArray src,OutputArray dst, double alpha=1, doublebeta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )

    该函数归一化输入数组使它的范数或者数值范围在一定的范围内。

Parameters:

src

    输入数组

dst

    输出数组,支持原地运算

alpha

    range normalization模式的最小值

beta

    range normalization模式的最大值,不用于norm normalization(范数归一化)模式。

normType

    归一化的类型,可以有以下的取值:

    NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。

    NORM_INF: 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C-范数(绝对值的最大值)

    NORM_L1 :  归一化数组的L1-范数(绝对值的和)

    NORM_L2: 归一化数组的(欧几里德)L2-范数

dtype

    dtype为负数时,输出数组的type与输入数组的type相同;

否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).

mask

    操作掩膜,用于指示函数是否仅仅对指定的元素进行操作。

归一化公式:

1、线性函数转换,表达式如下:(对应NORM_MINMAX)

ifmask(i,j)!=0

    dst(i,j)=(src(i,j)-min(src))*(b‘-a‘)/(max(src)-min(src))+ a‘

else

     dst(i,j)=src(i,j)

    其中b‘=MAX(a,b), a‘=MIN(a,b);

2. 当norm_type!=CV_MINMAX:

ifmask(i,j)!=0

    dst(i,j)=src(i,j)*a/norm (src,norm_type,mask)

else

    dst(i,j)=src(i,j)

    其中,函数norm的功能是计算norm(范数)的绝对值

Thefunctions norm calculate an absolute norm of src1 (when there is no src2 ):

技术分享



7. 创建同样大小、形状的图像

    (1)Mat imgIn=imread(" XXXXX");

    (2)Mat imgOut(newHeight, newWidth, imgIn.type());         // Mat resultImg;  XXXXXXXX;             resultImg.create(newHeight, newWidth, imgIn.type()); 

这两者是有区别的  ,Mat imgOut(newHeight, newWidth, imgIn.type());   仅仅是在定义的时候声明创建  而  resultImg.create(newHeight, newWidth, imgIn.type()); 是在先声明,然后在函数中创建

     (3)有待补充


8. 访问像素的几种方法

 (1). for( i=0;i<DstHeight;i++)
{ uchar *dst_data=OutImg.ptr<uchar>(i);

                 for(j=0;j<DstWidth;j++)

                 dst_data[j]=.....


  (2)  for( i=0;i<DstHeight;i++)
for(j=0;j<DstWidth;j++)
{
if(img.channels()==3)
{
out1.at<Vec3b>(i,j)=Vec3b(255,0,0);
}
else if(img.channels()==1)
{
out1.at<uchar>(i,j)=255;
}


                      if(img.channels()==3)
{
out1.at<Vec3b>(i,j)=img.at<Vec3b>(i1,j1);//(j1,i1);
}
else if(img.channels()==1)
{
out1.at<uchar>(i,j)=img.at<uchar>(i1,j1);


9.注意代码中添加检查低级错误的代码 说不定哪天就会犯错误  

今天就是的,至少检查了1个小时,还很郁闷

Mat SrcImg=imread("C:\\Users\\Administrator\\Desktop\\工作\\testp\\o1.jpg");

if(!SrcImg.data)

cout<<"读取图片错误\n";

//上面的o1.jpg   应该是01.jpg   一开始没有添加 就是内存报错 检查啊检查~~~~

 


0 0