使用Processing处理图像

时间:2015-05-02 05:49:42

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

-----------------正确的版本-----------

我目前正在使用Processing处理项目。我需要在我的项目中进行图像处理,最初我想过使用opencv。但不幸的是,我发现opencv for Processing并不是原版的完整版本。 如何使用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未正确安装,但它们已正确安装

3 个答案:

答案 0 :(得分:0)

看起来你正试图用OpenCV做template matching?听起来你的错误是安装OpenCV,而不是你的代码。

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

我可以与其他图书馆合作吗?
是的,请参阅您的问题的一些评论。但我认为你要做的具体过程将很困难。我认为你最好让OpenCV工作。

答案 1 :(得分:0)

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

请注意,img.pixels[i] 1维数组,而图片 2d 。访问2d位置的技巧是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);
}

结果:

答案 2 :(得分:-1)

以下是在处理中使用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;
}