【问题标题】:Image Processing using Processing使用处理的图像处理
【发布时间】:2015-05-02 05:49:42
【问题描述】:

------更正版本-----------

我目前正在使用 Processing 进行项目。我需要在我的项目中进行图像处理,最初我想使用opencv。但不幸的是,我发现用于处理的 opencv 并不是原始版本的完整版本。 如何开始使用 Processing 进行图像处理?我发现由于处理是java的包装器,所以java语言是可以接受的。我可以在处理中使用 JavaCV 吗?如果有,怎么做?
这是示例代码:-

import gab.opencv.*;
import org.opencv.imgproc.Imgproc;
import org.opencv.core.Core;
import org.opencv.highgui.Highgui;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.CvType;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.core.Core.MinMaxLocResult;
PImage imgBack, rightSection, leftSection;
PImage img;

void setup(){
  imgBack=loadImage("tk100backback.jpg");
  leftSection=imgBack.get(0,0,14,200);
  rightSection=imgBack.get(438,0,32,200);
  img=createImage(46,200,RGB);
  img.set(0,0,rightSection);
  img.set(32,0,leftSection);
  size(46,200);
  Mat src= Highgui.imread(img.toString());
  Mat tmp=Highgui.imread("templateStarMatching.jpg");
  int result_cols=src.cols()-tmp.cols()+1;
  int result_rows=src.rows()-tmp.rows()+1;
  Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
  Imgproc.matchTemplate(src, tmp, result, Imgproc.TM_CCOEFF_NORMED);

  MatOfPoint minLoc = new MatOfPoint();
  MatOfPoint maxLoc = new MatOfPoint();
  MinMaxLocResult mrec=new MinMaxLocResult();
  mrec=Core.minMaxLoc(result,null);

  System.out.println(mrec.minVal);
  System.out.println(mrec.maxVal);

  Point point = new Point(mrec.maxLoc.x+tmp.width(), mrec.maxLoc.y+tmp.height());
 // cvRectangle(src, maxLoc, point, CvScalar.WHITE, 2, 8, 0);//Draw a Rectangle for Matched Region

}
void draw(){
  image(img,0,0);
}

Core 不存在且 Highgui 未正确安装,但它们已正确安装,不断给我错误提示

【问题讨论】:

  • 如果您在处理中处于 Java 模式,您可以在您的草图中使用任何 Java 库。你试过什么?
  • 但是 java 类呢?
  • 他们呢?我真的不确定你的问题是什么。可以从 Processing 中使用 Java,也可以从 Java 中使用 Processing。
  • 也许您可以指定您想要进行的图像处理类型。处理它自己可以处理很多没有任何库...
  • 关于使用库,阅读:github.com/processing/processing/wiki/…底部是非处理库的说明。

标签: java opencv image-processing computer-vision processing


【解决方案1】:

您似乎正在尝试使用 OpenCV 执行 template matching?听起来您的错误与 OpenCV 的安装有关,而不是您的代码。

OpenCV 问题
1.你之前安装过OpenCV吗?这可能会导致处理版本出现问题。
2. 如果没有,请尝试减少代码,直到到达首先导致错误的行。如果它在导入语句中,您就知道这是 OpenCV 安装问题。 3. 你没有列出你的操作系统,但如果你使用的是 Mac,你可以关注我的detailed instructions for installing it。

我可以使用另一个库吗?
是的,请参阅您的问题的一些 cmets。但是我认为你正在尝试做的具体过程会很困难。我认为你最好让 OpenCV 工作。

【讨论】:

    【解决方案2】:

    以下代码在处理中读取图像,然后应用过滤器(在这种情况下,它会对其进行像素化)。

    注意img.pixels[i] 是一维数组,而图片是二维。访问二维位置的技巧是img.pixels[r*img.width + c],其中 r 和 c 分别是像素行和列

     // Declaring a variable of type PImage
    PImage img;  
    void setup() {
    
      // Make a new instance of a PImage by loading an image file
      ![enter image description here][1]img = loadImage("http://www.washingtonpost.com/wp-srv/special/lifestyle/the-age-of-obama/img/obama-v2/obama09.jpg");
      //img = loadImage("background.jpg");
      size(img.width, img.height);
    
    
       int uberPixel = 25;
      for(int row = 0; row < img.height; row+= uberPixel){
        for(int col = 0; col < img.width; col+= uberPixel){
          int colo[] = new int[3];
         int cnt = 0;
         for(int r = row; r <= row + uberPixel; r ++){
           for(int c = col; c <= col +uberPixel; c ++){
              if(r*img.width + c < img.pixels.length){
                colo[0] += red(img.pixels[r*img.width + c]);
                colo[1] += green(img.pixels[r*img.width + c]);
                colo[2] += blue(img.pixels[r*img.width + c]);
                cnt++;
              }
           }
         }
         //average color
         for(int i = 0; i < 3; i ++){
           colo[i] /= cnt;
         }
    
         //change pixel
         for(int r = row; r <= row + uberPixel; r ++){
           for(int c = col; c <= col +uberPixel; c ++){
             if(r*img.width + c < img.pixels.length){
               img.pixels[r*img.width+c] = color(colo[0],colo[1],colo[2]);
             } 
           }
         }
    
        }
      }
      image(img,0,0);
    }
    
    void draw() {
      image(img,0,0);
    }
    

    结果:

    【讨论】:

      【解决方案3】:

      这是在处理中使用javacv 的示例:

      import static com.googlecode.javacv.cpp.opencv_core.*;
      import static com.googlecode.javacv.cpp.opencv_imgproc.*;
      import static com.googlecode.javacv.cpp.opencv_highgui.*;
      
      void setup ()
      {
          size( 256, 256 );
      
          String fn = sketchPath("data/lena.jpg");
          IplImage ip= cvLoadImage(fn);
          if ( ip != null ) 
          {
              cvSmooth( ip, ip, CV_GAUSSIAN, 3 );
      
              PImage im = ipToPImage(ip);
              image( im, 0, 0 );       
              cvReleaseImage(ip);
          }
      }
      PImage ipToPImage ( IplImage ip ) 
      {
          java.awt.image.BufferedImage bImg = ip.getBufferedImage();
          PImage im = new PImage( bImg.getWidth(), bImg.getHeight(), ARGB );
          bImg.getRGB( 0, 0, im.width, im.height, im.pixels, 0, im.width );
          im.updatePixels();
          return im;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        相关资源
        最近更新 更多