2016-08-31 62 views
0

有没有一种可能的方式,使用opencv拍摄显示图像的图片以及算法的输出?像this,但这种方法是使用屏幕截图(powr + vol dwn),这是不高效的。使用颜色斑点检测器拍摄图像Opencv

我想包括颜色斑点检测的输出。我已经完成了截图方法,但问题是它总是黑色的,可能是因为在opencv中获取图像的方法不同。

回答

0

我假设你只是想在主图像,而不是标题菜单栏等

如果这是正确的,如果你正在使用或建筑物上的OpenCV的ColorBlobDetection例子,那么你实际上已经有图像我认为您需要在ColorBlobDetectionActivity的“onCameraFrame”方法的输出中 - 即返回的mRgba矩阵。

您应该可以保存或使用imwrite存储它。

这里是一个被测试和工程实例代码 - 实际上,你可能不希望这样做的每一帧上,而是做一次当一些触发设置,但下面的代码给出的总体思路:

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
     mRgba = inputFrame.rgba(); 

     if (mIsColorSelected) { 
      mDetector.process(mRgba); 
      List<MatOfPoint> contours = mDetector.getContours(); 
      Log.e(TAG, "Contours count: " + contours.size()); 
      Imgproc.drawContours(mRgba, contours, -1, CONTOUR_COLOR); 

      Mat colorLabel = mRgba.submat(4, 68, 4, 68); 
      colorLabel.setTo(mBlobColorRgba); 

      Mat spectrumLabel = mRgba.submat(4, 4 + mSpectrum.rows(), 70, 70 + mSpectrum.cols()); 
      mSpectrum.copyTo(spectrumLabel); 

      File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
      String testFilename = "TestOCVwrite.png"; 
      File testFile = new File(path, testFilename); 
      String testFullfileName = testFile.toString(); 
      Log.i(TAG, "Writing to filename: " + testFilename); 
      Boolean writeResult = Imgcodecs.imwrite(testFullfileName, mRgba); 
      if (!writeResult) { 
       Log.i(TAG, "Failed to write to filename: " + testFilename); 
      } 
     } 

     return mRgba; 
    } 

有些事情要注意:

确保您有写信给外部您清单的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

您需要也可为M请确保在文件名中包含文件类型,例如png,jpeg等,否则您将收到错误消息:

could not find a writer for the specified extension in function bool cv::imwrite_(const cv::String&, const cv::Mat&, const std::vector&, bool)