OpenCV Mat数据类型像素操作

 转自:http://blog.csdn.net/skeeee/article/details/13297457 

OpenCV图像像素操作及效率分析

        在计算机视觉应用中,对于图像内容的读取分析是第一步,所以学习高效的处理图像是很有用的。一个图像有可能包含数以万计的像素,从根本上说图像就是一系列像素值,所以OpenCV使用数据结构cv::Mat来表示图像。矩阵中每一个元素都代表一个像素,对于灰度图像,像素用8位无符号数,0表示黑色,255表示白色。对于彩色像素而言,每个像素需要三位这样的8位无符号数来表示,即三个通道(R,G,B),矩阵则依次存储一个像素的三个通道的值,然后再存储下一个像素点。

       cv::Mat中,成员变量cols代表图像的宽度(图像的列数),成员变量rows代表图像的高度(图像的行数),step代表以字节为单位的图像的有效宽度,elemSize返回像素的大小,像素的大小 = 颜色大小(字节)*通道数,比如三通道short型矩阵(CV_16SC3)的大小为2*3 = 6,像素的channels方法返回图像的通道数,total函数返回图像的像素数。

       闲话少说直接介绍几种读取方式:

       RGB图像的颜色数目是256*256*256,本文对图像进行量化,缩减颜色数目到256的1/8(即32*32*32)为目标,分别利用一下几种方法实现,比较几种方法的安全和效率。

       1.ptr遍历图像

       cv::Mat中提供ptr函数访问任意一行像素的首地址,特别方便图像的一行一行的横向访问,如果需要一列一列的纵向访问图像,就稍微麻烦一点。但是ptr访问效率比较高,程序也比较安全,有越界判断。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int nl= image.rows; //行数  
  2. int nc= image.cols * image.channels(); // 每行的元素个数,每行的像素数*颜色通道数(RGB = 3)  
  3.           
  4. for (int j=0; j<nl; j++) {  
  5.     uchar* data= image.ptr<uchar>(j);  
  6.     for (int i=0; i<nc; i++) {   
  7.       // process each pixel ---------------------                
  8.          data[i]= data[i]/div*div + div/2;  
  9.       // end of pixel processing ----------------  
  10.     } // end of line                     
  11. }  
     也可以使用:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.     for (int j=0; j<nl; j++) {  
  2.  uchar* data= image.ptr<uchar>(j);  
  3.         for (int i=0; i<nc; i++) {  
  4.           // process each pixel ---------------------                 
  5. *data++= *data/div*div + div/2;  
  6.           // end of pixel processing ----------------  
  7.           } // end of line                     
  8.     }  
   

2.使用迭代器遍历图像

     cv::Mat 同样有标准模板库(STL),可以使用迭代器访问数据。

     用迭代器来遍历图像像素,可简化过程降低出错的机会,比较安全,不过效率较低;如果想避免修改输入图像实例cv::Mat,可采用const_iterator。iterator有两种调用方法,cv::MatIterator_<cv::Vec3b> it;cv::Mat_<cv::Vec3b>::iterator it;中间cv::Vec3b是因为图像是彩色图像,3通道,cv::Vec3b可以代表一个像素。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. // get iterators  
  2.       cv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();  
  3.       cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();  
  4.   
  5.       for ( ; it!= itend; ++it) {  
  6.           
  7.         // process each pixel ---------------------  
  8.   
  9.         (*it)[0]= (*it)[0]/div*div + div/2;  
  10.         (*it)[1]= (*it)[1]/div*div + div/2;  
  11.         (*it)[2]= (*it)[2]/div*div + div/2;  
  12.   
  13.         // end of pixel processing ----------------  
  14.       }  

 3.at方法遍历

      cv::Mat也是向量,可以使at方法取值,使用调用方法image.at<cv::Vec3b>(j,i),at方法方便,直接给i,j赋值就可以随意访问图像中任何一个像素,其中j表示第j行,i表示该行第i个像素。但是at方法效率是这3中访问方法中最慢的一个,所以如果遍历图像或者访问像素比较多时,建议不要使用这个方法,毕竟程序的效率还是比程序的可读性要重要的。下面是完整的调用方法,其运行时间在下面会介绍。

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int nl= image.rows; // number of lines  
  2. int nc= image.cols; // number of columns  
  3.              
  4.    for (int j=0; j<nl; j++) {  
  5.        for (int i=0; i<nc; i++) {  
  6.   
  7.          // process each pixel ---------------------  
  8.                 
  9.                image.at<cv::Vec3b>(j,i)[0]=    image.at<cv::Vec3b>(j,i)[0]/div*div + div/2;  
  10.                image.at<cv::Vec3b>(j,i)[1]=    image.at<cv::Vec3b>(j,i)[1]/div*div + div/2;  
  11.                image.at<cv::Vec3b>(j,i)[2]=    image.at<cv::Vec3b>(j,i)[2]/div*div + div/2;  
  12.   
  13.          // end of pixel processing ----------------  
  14.   
  15.          } // end of line                     
  16.    }  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.   

  4.row(i),col(i)

       cv::Mat提供image.row(i),和image.col(j)对图像整行和整列进行处理,处理比较方便,因为很少遇到,所以就没有进行效率比较

  程序代码如下(三通道):

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. result.row(0).setTo(cv::Scalar(0,0,0));//将第一行数据设为零  
  2.     result.row(result.rows-1).setTo(cv::Scalar(0,0,0));//将最后一行数据设置为零  
  3.     result.col(0).setTo(cv::Scalar(0,0,0));//将第一列数据设为零  
  4.     result.col(result.cols-1).setTo(cv::Scalar(0,0,0));//将最后一列数据设为零  

5.高效率图像遍历循环

       对于迭代的for循环,外面一层的循环次数越少速度越快,同样是cols*rows*channels()次循环,使用nc = cols,nl = rows*channels(),与使用nc = cols*rows*channels,nl = 1,以及nc = cols,nl = rows,for函数最里层运行三次颜色的处理。这三种方法最快的是第二种,第三种其次,最慢的是第一种.  

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int nl= image.rows; // number of lines  
  2. int nc= image.cols * image.channels(); // total number of elements per line  
  3.   
  4. if (image.isContinuous())  {  
  5.  // then no padded pixels  
  6.  nc= nc*nl;   
  7.  nl= 1;  // it is now a 1D array  
  8.  }  
  9.   
  10. int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
  11. // mask used to round the pixel value  
  12. uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
  13.              
  14.    for (int j=0; j<nl; j++) {  
  15.   
  16.  uchar* data= image.ptr<uchar>(j);  
  17.   
  18.        for (int i=0; i<nc; i++) {  
  19.   
  20.          // process each pixel ---------------------  
  21.                 
  22.          *data++= *data&mask + div/2;  
  23.   
  24.          // end of pixel processing ----------------  
  25.   
  26.          } // end of line                     
  27.    }  

   6.位运算代替乘法和除法

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.        int nl= image.rows; // number of lines  
  2. int nc= image.cols * image.channels(); // total number of elements per line  
  3. int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
  4. // mask used to round the pixel value  
  5. uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
  6.              
  7.    for (int j=0; j<nl; j++) {  
  8.   
  9.  uchar* data= image.ptr<uchar>(j);  
  10.   
  11.        for (int i=0; i<nc; i++) {  
  12.   
  13.          // process each pixel ---------------------  
  14.                 
  15.          *data++= *data&mask + div/2;  
  16.   
  17.          // end of pixel processing ----------------  
  18.   
  19.          } // end of line                     
  20.    }  


运行时间比较,以测试图片为例,(Debug模式下的时间)

   ptr函数的两种方法的时间:
                using .ptr and [] = 3.50202ms
                using .ptr and * ++ = 3.26124ms
   迭代器方法:
              using Mat_ iterator = 143.06ms
   at方法的运行时间:
             using at = 252.779ms
   高效率迭代方法:
            using .ptr and * ++ and bitwise (continuous) = 2.68335ms
   位运算方法:

            using .ptr and * ++ and bitwise =2.59823ms


还有一些比较的函数方法,现在只给出运行时间:
         using .ptr and * ++ and modulo =3.78029ms
         using .ptr and * ++ and bitwise =2.59823ms
         using direct pointer arithmetic =2.57317ms
         using .ptr and * ++ and bitwise with image.cols * image.channels() =22.864ms
         using Mat_ iterator and bitwise =139.92ms
         using MatIterator_ =185.996ms
        using .ptr and * ++ and bitwise (continuous+channels) =2.11271ms
         using input/output images =2.97717ms
         using overloaded operators =2.7237ms


源图像:


量化处理结果 image1:


量化处理后的结果 image2:

附:OpenCV数据类型列表 

class   cv::_InputArray
  This is the proxy class for passing read-only input arrays into OpenCV functions. More...
 
class   cv::_InputOutputArray
 
class   cv::_OutputArray
  This type is very similar to InputArray except that it is used for input/output and output function parameters. More...
 
class   cv::Algorithm
  This is a base class for all more or less complex algorithms in OpenCV. More...
 
class   cv::Complex< _Tp >
  A complex number class. More...
 
class   cv::DataDepth< _Tp >
  A helper class for cv::DataType. More...
 
class   cv::DataType< _Tp >
  Template "trait" class for OpenCV primitive data types. More...
 
class   cv::DMatch
  Class for matching keypoint descriptors. More...
 
class   cv::Formatted
 
class   cv::Formatter
 
class   cv::KeyPoint
  Data structure for salient point detectors. More...
 
class   cv::Mat
  n-dimensional dense array class More...
 
class   cv::Mat_< _Tp >
  Template matrix class derived from Mat. More...
 
class   cv::MatAllocator
  Custom array allocator. More...
 
class   cv::MatCommaInitializer_< _Tp >
  Comma-separated Matrix Initializer. More...
 
class   cv::MatConstIterator
 
class   cv::MatConstIterator_< _Tp >
  Matrix read-only iterator. More...
 
class   cv::MatExpr
  Matrix expression representation. More...
 
class   cv::MatIterator_< _Tp >
  Matrix read-write iterator. More...
 
class   cv::MatOp
 
struct   cv::MatSize
 
struct   cv::MatStep
 
class   cv::Matx< _Tp, m, n >
  Template class for small matrices whose type and size are known at compilation time. More...
 
class   cv::MatxCommaInitializer< _Tp, m, n >
  Comma-separated Matrix Initializer. More...
 
class   cv::NAryMatIterator
  n-ary multi-dimensional array iterator. More...
 
struct   cv::Param
 
struct   cv::ParamType< _Tp >
 
struct   cv::ParamType< Algorithm >
 
struct   cv::ParamType< bool >
 
struct   cv::ParamType< double >
 
struct   cv::ParamType< float >
 
struct   cv::ParamType< Mat >
 
struct   cv::ParamType< std::vector< Mat > >
 
struct   cv::ParamType< String >
 
struct   cv::ParamType< uchar >
 
struct   cv::ParamType< uint64 >
 
struct   cv::ParamType< unsigned >
 
class   cv::Point3_< _Tp >
  Template class for 3D points specified by its coordinates xy and z. More...
 
class   cv::Point_< _Tp >
  Template class for 2D points specified by its coordinates x and y. More...
 
struct   cv::Ptr< T >
  Template class for smart pointers with shared ownership. More...
 
class   cv::Range
  Template class specifying a continuous subsequence (slice) of a sequence. More...
 
class   cv::Rect_< _Tp >
  Template class for 2D rectangles. More...
 
class   cv::RotatedRect
  The class represents rotated (i.e. not up-right) rectangles on a plane. More...
 
class   cv::Scalar_< _Tp >
  Template class for a 4-element vector derived from Vec. More...
 
class   cv::Size_< _Tp >
  Template class for specifying the size of an image or rectangle. More...
 
class   cv::SparseMat
  The class SparseMat represents multi-dimensional sparse numerical arrays. More...
 
class   cv::SparseMat_< _Tp >
  Template sparse n-dimensional array class derived from SparseMat. More...
 
class   cv::SparseMatConstIterator
  Read-Only Sparse Matrix Iterator. More...
 
class   cv::SparseMatConstIterator_< _Tp >
  Template Read-Only Sparse Matrix Iterator Class. More...
 
class   cv::SparseMatIterator
  Read-write Sparse Matrix Iterator. More...
 
class   cv::SparseMatIterator_< _Tp >
  Template Read-Write Sparse Matrix Iterator Class. More...
 
class   cv::String
 
class   cv::TermCriteria
  The class defining termination criteria for iterative algorithms. More...
 
class   cv::TypeDepth< _depth >
 
class   cv::TypeDepth< CV_16S >
 
class   cv::TypeDepth< CV_16U >
 
class   cv::TypeDepth< CV_32F >
 
class   cv::TypeDepth< CV_32S >
 
class   cv::TypeDepth< CV_64F >
 
class   cv::TypeDepth< CV_8S >
 
class   cv::TypeDepth< CV_8U >
 
class   cv::UMat
 
struct   cv::UMatData
 
struct   cv::UMatDataAutoLock
 
class   cv::Vec< _Tp, cn >
  Template class for short numerical vectors, a partial case of Matx. More...
 
class   cv::VecCommaInitializer< _Tp, m >
  Comma-separated Vec Initializer. More...
 

Typedefs

typedef Complex< double >  cv::Complexd
 
typedef Complex< float >  cv::Complexf
 
typedef const _InputArray &  cv::InputArray
 
typedef InputArray  cv::InputArrayOfArrays
 
typedef const _InputOutputArray &  cv::InputOutputArray
 
typedef InputOutputArray  cv::InputOutputArrayOfArrays
 
typedef Mat_< uchar >  cv::Mat1b
 
typedef Mat_< double >  cv::Mat1d
 
typedef Mat_< float >  cv::Mat1f
 
typedef Mat_< int >  cv::Mat1i
 
typedef Mat_< short >  cv::Mat1s
 
typedef Mat_< ushort >  cv::Mat1w
 
typedef Mat_< Vec2b >  cv::Mat2b
 
typedef Mat_< Vec2d >  cv::Mat2d
 
typedef Mat_< Vec2f >  cv::Mat2f
 
typedef Mat_< Vec2i >  cv::Mat2i
 
typedef Mat_< Vec2s >  cv::Mat2s
 
typedef Mat_< Vec2w >  cv::Mat2w
 
typedef Mat_< Vec3b >  cv::Mat3b
 
typedef Mat_< Vec3d >  cv::Mat3d
 
typedef Mat_< Vec3f >  cv::Mat3f
 
typedef Mat_< Vec3i >  cv::Mat3i
 
typedef Mat_< Vec3s >  cv::Mat3s
 
typedef Mat_< Vec3w >  cv::Mat3w
 
typedef Mat_< Vec4b >  cv::Mat4b
 
typedef Mat_< Vec4d >  cv::Mat4d
 
typedef Mat_< Vec4f >  cv::Mat4f
 
typedef Mat_< Vec4i >  cv::Mat4i
 
typedef Mat_< Vec4s >  cv::Mat4s
 
typedef Mat_< Vec4w >  cv::Mat4w
 
typedef Matx< double, 1, 2 >  cv::Matx12d
 
typedef Matx< float, 1, 2 >  cv::Matx12f
 
typedef Matx< double, 1, 3 >  cv::Matx13d
 
typedef Matx< float, 1, 3 >  cv::Matx13f
 
typedef Matx< double, 1, 4 >  cv::Matx14d
 
typedef Matx< float, 1, 4 >  cv::Matx14f
 
typedef Matx< double, 1, 6 >  cv::Matx16d
 
typedef Matx< float, 1, 6 >  cv::Matx16f
 
typedef Matx< double, 2, 1 >  cv::Matx21d
 
typedef Matx< float, 2, 1 >  cv::Matx21f
 
typedef Matx< double, 2, 2 >  cv::Matx22d
 
typedef Matx< float, 2, 2 >  cv::Matx22f
 
typedef Matx< double, 2, 3 >  cv::Matx23d
 
typedef Matx< float, 2, 3 >  cv::Matx23f
 
typedef Matx< double, 3, 1 >  cv::Matx31d
 
typedef Matx< float, 3, 1 >  cv::Matx31f
 
typedef Matx< double, 3, 2 >  cv::Matx32d
 
typedef Matx< float, 3, 2 >  cv::Matx32f
 
typedef Matx< double, 3, 3 >  cv::Matx33d
 
typedef Matx< float, 3, 3 >  cv::Matx33f
 
typedef Matx< double, 3, 4 >  cv::Matx34d
 
typedef Matx< float, 3, 4 >  cv::Matx34f
 
typedef Matx< double, 4, 1 >  cv::Matx41d
 
typedef Matx< float, 4, 1 >  cv::Matx41f
 
typedef Matx< double, 4, 3 >  cv::Matx43d
 
typedef Matx< float, 4, 3 >  cv::Matx43f
 
typedef Matx< double, 4, 4 >  cv::Matx44d
 
typedef Matx< float, 4, 4 >  cv::Matx44f
 
typedef Matx< double, 6, 1 >  cv::Matx61d
 
typedef Matx< float, 6, 1 >  cv::Matx61f
 
typedef Matx< double, 6, 6 >  cv::Matx66d
 
typedef Matx< float, 6, 6 >  cv::Matx66f
 
typedef const _OutputArray &  cv::OutputArray
 
typedef OutputArray  cv::OutputArrayOfArrays
 
typedef Point2i  cv::Point
 
typedef Point_< double >  cv::Point2d
 
typedef Point_< float >  cv::Point2f
 
typedef Point_< int >  cv::Point2i
 
typedef Point3_< double >  cv::Point3d
 
typedef Point3_< float >  cv::Point3f
 
typedef Point3_< int >  cv::Point3i
 
typedef Rect2i  cv::Rect
 
typedef Rect_< double >  cv::Rect2d
 
typedef Rect_< float >  cv::Rect2f
 
typedef Rect_< int >  cv::Rect2i
 
typedef Scalar_< double >  cv::Scalar
 
typedef Size2i  cv::Size
 
typedef Size_< double >  cv::Size2d
 
typedef Size_< float >  cv::Size2f
 
typedef Size_< int >  cv::Size2i
 

Enumerations

enum  
  cv::ACCESS_READ =1<<24, 
  cv::ACCESS_WRITE =1<<25, 
  cv::ACCESS_RW =3<<24, 
  cv::ACCESS_MASK =ACCESS_RW, 
  cv::ACCESS_FAST =1<<26 
}
 
enum   cv::UMatUsageFlags { 
  cv::USAGE_DEFAULT = 0, 
  cv::USAGE_ALLOCATE_HOST_MEMORY = 1 << 0, 
  cv::USAGE_ALLOCATE_DEVICE_MEMORY = 1 << 1, 
  cv::USAGE_ALLOCATE_SHARED_MEMORY = 1 << 2, 
  cv::__UMAT_USAGE_FLAGS_32BIT = 0x7fffffff 
}
  Usage flags for allocator. More...
 

Functions

template<typename _Tp , int m>
static double  cv::determinant (const Matx< _Tp, m, m > &a)
 
template<typename T >
Ptr< T >  cv::makePtr ()
 
template<typename T , typename A1 >
Ptr< T >  cv::makePtr (const A1 &a1)
 
template<typename T , typename A1 , typename A2 >
Ptr< T >  cv::makePtr (const A1 &a1, const A2 &a2)
 
template<typename T , typename A1 , typename A2 , typename A3 >
Ptr< T >  cv::makePtr (const A1 &a1, const A2 &a2, const A3 &a3)
 
template<typename T , typename A1 , typename A2 , typename A3 , typename A4 >
Ptr< T >  cv::makePtr (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
 
template<typename T , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 >
Ptr< T >  cv::makePtr (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
 
template<typename T , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 >
Ptr< T >  cv::makePtr (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6)
 
template<typename T , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 >
Ptr< T >  cv::makePtr (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7)
 
template<typename T , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 >
Ptr< T >  cv::makePtr (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8)
 
template<typename T , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 >
Ptr< T >  cv::makePtr (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9)
 
template<typename T , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 , typename A10 >
Ptr< T >  cv::makePtr (const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, const A9 &a9, const A10 &a10)
 
InputOutputArray  cv::noArray ()
 
template<typename _Tp , int m, int n>
static double  cv::norm (const Matx< _Tp, m, n > &M)
 
template<typename _Tp , int m, int n>
static double  cv::norm (const Matx< _Tp, m, n > &M, int normType)
 
template<typename _Tp , int cn>
static Vec< _Tp, cn >  cv::normalize (const Vec< _Tp, cn > &v)
 
template<typename T >
bool  cv::operator != (const Ptr< T > &ptr1, const Ptr< T > &ptr2)
 
static String &  cv::operator<< (String &out, Ptr< Formatted > fmtd)
 
static String &  cv::operator<< (String &out, const Mat &mtx)
 
template<typename T >
bool  cv::operator== (const Ptr< T > &ptr1, const Ptr< T > &ptr2)
 
template<typename T >
void  cv::swap (Ptr< T > &ptr1, Ptr< T > &ptr2)
 
template<typename _Tp , int m, int n>
static double  cv::trace (const Matx< _Tp, m, n > &a)
 

Shorter aliases for the most popular specializations of Vec<T,n>

typedef Vec< uchar, 2 >  cv::Vec2b
 
typedef Vec< uchar, 3 >  cv::Vec3b
 
typedef Vec< uchar, 4 >  cv::Vec4b
 
typedef Vec< short, 2 >  cv::Vec2s
 
typedef Vec< short, 3 >  cv::Vec3s
 
typedef Vec< short, 4 >  cv::Vec4s
 
typedef Vec< ushort, 2 >  cv::Vec2w
 
typedef Vec< ushort, 3 >  cv::Vec3w
 
typedef Vec< ushort, 4 >  cv::Vec4w
 
typedef Vec< int, 2 >  cv::Vec2i
 
typedef Vec< int, 3 >  cv::Vec3i
 
typedef Vec< int, 4 >  cv::Vec4i
 
typedef Vec< int, 6 >  cv::Vec6i
 
typedef Vec< int, 8 >  cv::Vec8i
 
typedef Vec< float, 2 >  cv::Vec2f
 
typedef Vec< float, 3 >  cv::Vec3f
 
typedef Vec< float, 4 >  cv::Vec4f
 
typedef Vec< float, 6 >  cv::Vec6f
 
typedef Vec< double, 2 >  cv::Vec2d
 
typedef Vec< double, 3 >  cv::Vec3d
 
typedef Vec< double, 4 >  cv::Vec4d
 
typedef Vec< double, 6 >  cv::Vec6d
http://docs.opencv.org/trunk/dc/d84/group__core__basic.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bumblebee微服务网关之Url重写

为了提高Url访问的统一和友好性&#xff0c;一般访问的Url和服务定义的Url有所不同;为了解决这一问题Bumblebee提供Url重写功能;通过Url重写功能可以在转发前进行一个重写后再转发到后台服务。引用插件Bumblebee中使用Url重写需要引用两个插件&#xff0c;分别是Bumblebee.Conf…

依赖注入:一个Mini版的依赖注入框架

前面的章节中&#xff0c;我们从纯理论的角度对依赖注入进行了深入论述&#xff0c;我们接下来会对.NET Core依赖注入框架进行单独介绍。为了让读者朋友能够更好地理解.NET Core依赖注入框架的设计与实现&#xff0c;我们按照类似的原理创建了一个简易版本的依赖注入框架&#…

.NET Core 3.0 新 JSON API - JsonSerializer

JsonSerializer 前面几节的内容可能稍微有点底层&#xff0c;我们大部分时候可能只需要对C#的类进行串行化或者将JSON数据反串行化成C#类&#xff0c;在.NET Core 3.0里面&#xff0c;我们可以使用JsonSerializer这个类来做这些事情。 例子 还是使用之前用到的json数据&#xf…

Caffe查看每一层学习出来的pattern

Filter visualization http://www.cnblogs.com/dupuleng/articles/4244877.html 这一节参考http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/filter_visualization.ipynb&#xff0c;主要介绍如何显示每一层的参数及输出&#xff0c;这一部分非常重要&am…

.NET Core 3.0 新 JSON API - Utf8JsonWriter

Utf8JsonWriter类 下面研究一下如何写入json文件。这里需要使用Utf8JsonWriter类。 直接看代码&#xff1a; 这个类需要传递的参数类型是Stream或者Buffer&#xff0c;也就是向Stream或Buffer里面写入数据。 那么就提供一个buffer&#xff1a; 下面单独写一个方法&#xff0c;来…

python查看CNN训练模型参数

参照&#xff1a;http://blog.csdn.net/u011762313/article/details/49851795 #!/usr/bin/env python# 引入“咖啡” import caffeimport numpy as np# 使输出的参数完全显示 # 若没有这一句&#xff0c;因为参数太多&#xff0c;中间会以省略号“……”的形式代替 np.set_prin…

Bumblebee微服务网关之consul服务发现

网关需要维护相关负载的服务器&#xff0c;手动添加相对来说是一件比较麻烦的工作&#xff1b;为了解决这一问题组件扩展了一个基于consul服务发现插件&#xff0c;通过配置这个插件和启用后网关会自动从consul服务中获取服务并添加到网关对应的路由负载规则中。引用插件Bumble…

Github带来的不止是开源,还有折叠的认知

几乎每个程序员都知道github&#xff0c;但是知道目前上面有多少repositories的估计没几个。Z哥今天去看了下&#xff0c;最新的数量显示是1.39亿个。▲截图来自于github.com而这个数字在2008年那会只是3.3万个。这个增长速度可谓真的是“爆炸式增长”。与此同时&#xff0c;大…

最优间隔分类器-SVM

http://blog.csdn.net/Andrewseu/article/details/46991541 本讲大纲&#xff1a; 1.最优间隔分类器(optimal margin classifier) 2.原始/对偶优化问题&#xff08;KKT&#xff09;&#xff08;primal/dual optimization problem&#xff09; 3.SVM对偶(SVM dual) 4.核方法(…

自动给 Asp.Net Core Api 增加 ApiVersionNeutral

自动给 Asp.Net Core Api 增加 ApiVersionNeutralIntro新增加一个 Controller 的时候&#xff0c;经常忘记在 Controller 上增加 ApiVersion &#xff0c;结果就导致前端使用指定的 ApiVersion 访问的时候就会失败&#xff0c;不支持的 Api 版本。错误信息如下&#xff1a;{ &q…

K-means与高斯混合模型

K-means http://blog.pluskid.org/?p17 Clustering 中文翻译作“聚类”&#xff0c;简单地说就是把相似的东西分到一组&#xff0c;同 Classification (分类)不同&#xff0c;对于一个 classifier &#xff0c;通常需要你告诉它“这个东西被分为某某类”这样一些例子&#xf…

轻量级ORM《sqlcommon》第一个版本发布了

一、sqlcommon的特色1. 轻量级&#xff0c;整个包只有123kb。2. 性能好&#xff0c;自测。。。3. API和功能简单、代码简短、可维护性好基本都能看懂。这个点我认为很重要&#xff0c;你不用为了实现一个需求而四处查资料&#xff0c;这意味着这个包你可以自行维护修改&#xf…

从基于直方图的Graph-Cut到Grab-Cut

http://blog.csdn.net/zouxy09/article/details/8534954 区别&#xff1a; &#xff08;1&#xff09;Graph Cut的目标和背景的模型是灰度直方图&#xff0c;Grab Cut取代为RGB三通道的混合高斯模型GMM&#xff1b; &#xff08;2&#xff09;Graph Cut的能量最小化&#xf…

1024程序员节活动继续:购书优惠劵,折后再折,赶紧来抢啊

1024程序员节当当网计算机图书每满100减50&#xff01;满200减100&#xff01;满300-150&#xff01;机械工业出版社华章公司联合当当网特意为【DotNET技术圈】用户申请了一批可与满减叠加使用的“满200减30”的图书优惠码&#xff0c;优惠码使用后相当于&#xff1a;400减230 …

Shape Context

http://blog.csdn.net/u012507022/article/details/52437149 形状上下文特征是一种很流行的形状描述子&#xff0c;多用于目标识别&#xff0c;它采用一种基于形状轮廓的特征描述方法,其在对数极坐标系下利用直方图描述形状特征能够很好地反映轮廓上采样点的分布情况。 形状上下…

使用Magicodes.SwaggerUI快速配置SwaggerUI以及设置API分组

Magicodes.SwaggerUI快速配置和集成SwaggerUI特点通过配置文件简单配置即可完成SwaggerUI的API格式JSON生成和集成支持API分组和隐藏支持自定义页面和验证Nuget包联系我们订阅号关注“麦扣聊技术”微信订阅号可以获得最新文章、教程、文档。QQ群编程交流群<85318032>产品…

机器学习四大降维方法

http://www.36dsj.com/archives/26723 引言 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。…

深入研究.NET Core的本地化机制

ASP.NET Core中提供了一些本地化服务和中间件&#xff0c;可将网站本地化为不同的语言文化。ASP.NET Core中我们可以使用Microsoft.AspNetCore.Localization库来实现本地化。在.NET Core 2.0以上版本, Microsoft.AspNetCore.Localization已经包含在了Microsoft.AspNetCore.All中…

.Net Core 3.0 IdentityServer4 快速入门02

.Net Core 3.0 IdentityServer4 快速入门—— resource owner password credentials&#xff08;密码模式&#xff09;一、前言OAuth2.0默认有四种授权模式&#xff08;GrantType&#xff09;&#xff1a;1&#xff09;授权码模式2&#xff09;简化模式3&#xff09;密码模式&a…

.Net Core3.0 日志 logging

多年的经验&#xff0c;日志记录是软件开发的重要组成部分。没有日志记录机制的系统不是完善的系统。在开发阶段可以通过debug附件进程进行交互调试&#xff0c;可以检测到一些问题&#xff0c;但是在上线之后&#xff0c;日志的记录起到至关重要的作用。它可使我们在系统出现问…