xiaolongxiariji 2015-08-11 02:44 采纳率: 0%
浏览 1288

在安卓中,如何对摄像头采入的不同图像帧进行不同的处理

在opencv4Android中,打开摄像头后,对图片进行处理,以下代码是对同一帧的不同处理,而我想实现的是对不同帧进行不同处理,比如前后帧,但不知该怎么办?


  public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

   mRgba = inputFrame.rgba();
   Size sizeRgba = mRgba.size();
   int rows = (int) sizeRgba.height;
    int cols = (int) sizeRgba.width;
    Mat rgbaInnerWindow;

    int left = cols / 8;
    int top = rows / 8;

    int width = cols * 3 / 4;
    int height = rows * 3 / 4;
    //灰度图
   if(mProcessMethod==1)
    Imgproc.cvtColor(inputFrame.gray(), mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
   //Canny边缘检测
   else if(mProcessMethod==2)
   {
    mRgba = inputFrame.rgba();
    Imgproc.Canny(inputFrame.gray(), mTmp, 80, 100);
    Imgproc.cvtColor(mTmp, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
   }
   //Hist
   else if(mProcessMethod==3)
   {
     Mat hist = new Mat();
       int thikness = (int) (sizeRgba.width / (mHistSizeNum + 10) / 5);
       if(thikness > 5) thikness = 5;
       int offset = (int) ((sizeRgba.width - (5*mHistSizeNum + 4*10)*thikness)/2);

   // RGB
       for(int c=0; c<3; c++) {
         Imgproc.calcHist(Arrays.asList(mRgba), mChannels[c], mMat0, hist, mHistSize, mRanges);
         Core.normalize(hist, hist, sizeRgba.height/2, 0, Core.NORM_INF);
         hist.get(0, 0, mBuff);
         for(int h=0; h<mHistSizeNum; h++) {
           mP1.x = mP2.x = offset + (c * (mHistSizeNum + 10) + h) * thikness;
           mP1.y = sizeRgba.height-1;
           mP2.y = mP1.y - 2 - (int)mBuff[h];
           Core.line(mRgba, mP1, mP2, mColorsRGB[c], thikness);
         }
       }
       // Value and Hue
       Imgproc.cvtColor(mRgba, mTmp, Imgproc.COLOR_RGB2HSV_FULL);
       // Value
       Imgproc.calcHist(Arrays.asList(mTmp), mChannels[2], mMat0, hist, mHistSize, mRanges);
       Core.normalize(hist, hist, sizeRgba.height/2, 0, Core.NORM_INF);
       hist.get(0, 0, mBuff);
       for(int h=0; h<mHistSizeNum; h++) {
         mP1.x = mP2.x = offset + (3 * (mHistSizeNum + 10) + h) * thikness;
         mP1.y = sizeRgba.height-1;
         mP2.y = mP1.y - 2 - (int)mBuff[h];
         Core.line(mRgba, mP1, mP2, mWhilte, thikness);
       }
   }
   //inner Window Sobel
   else if(mProcessMethod==4)
   {
    Mat gray = inputFrame.gray();
      Mat grayInnerWindow = gray.submat(top, top + height, left, left + width);
      rgbaInnerWindow = mRgba.submat(top, top + height, left, left + width);
      Imgproc.Sobel(grayInnerWindow, mIntermediateMat, CvType.CV_8U, 1, 1);
      Core.convertScaleAbs(mIntermediateMat, mIntermediateMat, 10, 0);
      Imgproc.cvtColor(mIntermediateMat, rgbaInnerWindow, Imgproc.COLOR_GRAY2BGRA, 4);
      grayInnerWindow.release();
      rgbaInnerWindow.release();
   }
   //SEPIA
   else if(mProcessMethod==5)
   {
    rgbaInnerWindow = mRgba.submat(top, top + height, left, left + width);
      Core.transform(rgbaInnerWindow, rgbaInnerWindow, mSepiaKernel);
      rgbaInnerWindow.release();
   }
   //ZOOM
   else if(mProcessMethod==6)
   {
    Mat zoomCorner = mRgba.submat(0, rows / 2 - rows / 10, 0, cols / 2 - cols / 10);
      Mat mZoomWindow = mRgba.submat(rows / 2 - 9 * rows / 100, rows / 2 + 9 * rows / 100, cols / 2 - 9 * cols / 100, cols / 2 + 9 * cols / 100);
      Imgproc.resize(mZoomWindow, zoomCorner, zoomCorner.size());
      Size wsize = mZoomWindow.size();
      Core.rectangle(mZoomWindow, new Point(1, 1), new Point(wsize.width - 2, wsize.height - 2), new Scalar(255, 0, 0, 255), 2);
      zoomCorner.release();
      mZoomWindow.release();
   }
   //PIXELIZE
   else if(mProcessMethod==7)
   {
    rgbaInnerWindow = mRgba.submat(top, top + height, left, left + width);
      Imgproc.resize(rgbaInnerWindow, mIntermediateMat, mSize0, 0.1, 0.1, Imgproc.INTER_NEAREST);
      Imgproc.resize(mIntermediateMat, rgbaInnerWindow, rgbaInnerWindow.size(), 0., 0., Imgproc.INTER_NEAREST);
      rgbaInnerWindow.release();
   }
   //POSTERIZE
   else if(mProcessMethod==8)
   {
    rgbaInnerWindow = mRgba.submat(top, top + height, left, left + width);
      Imgproc.Canny(rgbaInnerWindow, mIntermediateMat, 80, 90);
      rgbaInnerWindow.setTo(new Scalar(0, 0, 0, 255), mIntermediateMat);
      Core.convertScaleAbs(rgbaInnerWindow, mIntermediateMat, 1./16, 0);
      Core.convertScaleAbs(mIntermediateMat, rgbaInnerWindow, 16, 0);
      rgbaInnerWindow.release();
   }
   else
    mRgba = inputFrame.rgba();
   return mRgba;
  }
}
  • 写回答

1条回答 默认 最新

  • youcans_ 人工智能领域优质创作者 2023-01-28 09:28
    关注

    读取当前帧之前,把上次读取的帧复制为 frameLast,而把本次读取的当前帧保存为 frameNow,如此往复,就可以通过 frameLast 和frameNow 处理前后帧。

    评论

报告相同问题?

悬赏问题

  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏