其他分享
首页 > 其他分享> > OpenCV cheatsheet

OpenCV cheatsheet

作者:互联网

OpenCV cheatsheet

构造

生成随机矩阵

Mat m(100,200,CV_8U);
randu(m,0,255); // 用0~255中的随机数填充m

打开摄像头

请使用opencv > 3.3.1.11版本

   while True:
       ret, frame = cap.read()
       cv2.imshow('frame', frame)  # 一个窗口用以显示原视频

       if cv2.waitKey(1) & 0xFF == ord('q'):
           break

矩形

cv2.rectangle(image,x,y,x+width,y+height,(b,g,r),linewidth)

类型

opencv中给出了很多种表示类型的方法,比如在cv::Mat的构造函数中

cv::Mat m(100,100,CV_8U3);

就给出了一个3 channel的unchar数组,此处的CV_8U3其实是CV中define的一个整数

作为模板的参数,则不可使用,如果用模板构造一个一样的矩阵,应该是

cv::Mat_<Vec3b> m(100,100);

初始化

可以使用赋值对一些array进行初始化,向量可以用{a,b,c}初始化,点可以用{a,b}初始化,数组可以用常值初始化

计时

double t = (double)cv::getTickCount();
/*

some code

*/
t = ((double)cv::getTickCount()-t)/cv::getTickFrequency();

仿射变换

img = cv2.warpAffine(img, W, img.shape[:2])

其中WWW是一个2*3的矩阵(即默认第三行是0,0,1),如果要单纯进行旋转,可以通过

W = cv2.getRotationMatrix2D(origin, 30,1)

来得到WWW

透明mask

dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)

dst = src1alpha + src2beta + gamma;

分割通道

  Mat aChannels[3];
  split(img, aChannels);

取某一区域

Rect rect(50,20, 200, 50); 
Mat ROI = img(rect);

0~1和uint8转换

for(int i =0;i<rows;i++){
    for(int j = 0;j<cols;j++){
      imgGrayF32(i,j) = imgGray(i,j)/255.;
    }
  }

尽管Mat.convertTo可以进行转化,但是转换后的图imshow全白不知道怎么回事
但是反过来想把F32转成u8却可以

取多通道图片的元素

正确做法

cout<<img(i,j)(k) <<endl;

错误做法

cout<<img(i,j,k) <<endl;

错误

[1] 6356 segmentation fault (core dumped)

可能由于没有给Mat指定大小而访问导致

标签:初始化,Mat,img,cv2,OpenCV,cheatsheet,100,cv
来源: https://blog.csdn.net/luo3300612/article/details/88432319