【问题标题】:OpenCV pyrMeanShiftFilter in Processing--problems with matrix处理中的 OpenCV pyrMeanShiftFilter——矩阵问题
【发布时间】:2017-07-19 16:13:31
【问题描述】:

我正在尝试在名为 Processing 的程序中使用 OpenCV 的均值偏移函数,该程序是一种基于 Java 的语言。到目前为止,我知道该函数需要两个 mat 和两个 double,[ pyrMeanShiftFiltering( Mat, Mat, Double, Double) ] 并且 mat 需要是 8 位和 3 个通道。但是,当我运行它时,它似乎只对图像的上 3/4 起作用,而将其余部分剪掉。

有谁知道如何让这个函数在整个图像上运行?

示例图片:cat.jpg

import gab.opencv.*;
import java.nio.*;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.Mat;
import org.opencv.core.CvType;
import org.opencv.core.Core; 

OpenCV opencv;
Imgproc imgproc;

PImage canny;
PImage src, out;
Mat one, two;
double a = 20.0;
double b = 10.0;

void setup() {
  src = loadImage("cat.jpg");
  size( 429, 360);

  System.loadLibrary(Core.NATIVE_LIBRARY_NAME);  
  one = new Mat( width, height, CvType.CV_8UC3);
  two = new Mat( width, height, CvType.CV_8UC3);

  one = toMat(src);
  imgproc.pyrMeanShiftFiltering( one, two, a, b);
  out = toPImage(two); 
}

void draw() {
  image(out, 0, 0, width, height);
}

Mat toMat(PImage image) {  
  int w = image.width;  
  int h = image.height;  
  Mat mat = new Mat(h, w, CvType.CV_8UC3);  
  byte[] data8 = new byte[w*h*4];  
  int[] data32 = new int[w*h];  
  arrayCopy(image.pixels, data32);  
  ByteBuffer bBuf = ByteBuffer.allocate(w*h*4);  
  IntBuffer iBuf = bBuf.asIntBuffer();  
  iBuf.put(data32);  
  bBuf.get(data8);  
  mat.put(0, 0, data8);  
  return mat;
}  

 PImage toPImage(Mat mat) { 
  int w = mat.width(); 
  int h = mat.height(); 
  PImage image = createImage(w, h, ARGB); 
  byte[] data8 = new byte[w*h*4]; 
  int[] data32 = new int[w*h]; 
  mat.get(0, 0, data8); 
  ByteBuffer.wrap(data8).asIntBuffer().get(data32); 
  arrayCopy(data32, image.pixels); 
  return image;
} 

【问题讨论】:

    标签: java opencv matrix processing pixels


    【解决方案1】:

    问题是您在应该在列的位置使用行,在应该在行的位置使用列。更多信息请查看Mat documentation

    所以,只要你有这个:

    new Mat( width, height, CvType.CV_8UC3);
    

    倒序

    new Mat( height, width, CvType.CV_8UC3);
    

    另外,我注意到您有一个 4 通道图像 (ARGB) 并且 toMat 函数也有 4 个通道,但是您创建一个只有 3 个 CV_8UC3 的 Mat,您应该使用 4 个 CV_8UC4(在 java 中不确定),请注意,通常 opencv 使用的是 BGRA !所以你可能需要正确混合频道。

    希望对你有帮助

    【讨论】:

    • 当我颠倒顺序时,图像失真并且在底部仍然被切断。对于通道,该函数需要一个 8 位和 3 个通道,如果我使用 4 则会给我一个错误。你知道如何更改 toMat 函数,使其具有三个通道吗?
    • @Qwerty 最简单的方法(不一定是最有效的)是使用函数splitmergemixChannels。拆分将为您提供每个通道作为垫子,然后加入或混合通道可以创建一个包含您想要的 3 通道垫。关于宽度和高度,它应该随处改变
    猜你喜欢
    • 1970-01-01
    • 2023-03-06
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多