2013-03-30 50 views
3

我想一個C轉換++從previous answer方法我收到使用OpenCV的Java綁定通過OpenCV的墊在Java綁定循環

使用的OpenCV到Java

C++代碼:

cv::Mat gray; 
cv::Mat element = cv::getStructuringElement(cv::MORPH_CROSS, 
             cv::Size(2 * erosion_size + 1, 2 * erosion_size + 1), 
             cv::Point(erosion_size, erosion_size)); 
cv::erode(gray, gray, element); 
// Scan the image searching for points and store them in a vector 
std::vector<cv::Point> points; 
cv::Mat_<uchar>::iterator it = gray.begin<uchar>(); 
cv::Mat_<uchar>::iterator end = gray.end<uchar>(); 
for (; it != end; it++) 
{ 
    if (*it) 
     points.push_back(it.pos()); 
} 

我想不通了解如何循環訪問C代碼中的gray變量。下面是我到目前爲止有:

Java代碼:

Mat gray = new Mat(); 
Mat element = Imgproc.getStructuringElement(
       Imgproc.MORPH_CROSS, new Size(2 * erosion_size + 1, 2 * erosion_size + 1), new Point(erosion_size, erosion_size) 
     ); 
Imgproc.erode(img, gray, element); 
List <Point> p = new ArrayList<Point>(); 
//How to loop through the gray variable? 

我通過API's去,似乎Mat確實有越來越rowscols方法,但我不能叫Iterator上什麼..

+0

就像我之前告訴過你,使用JavaCV 。 – syb0rg

+0

@ syb0rg它看起來像你之前刪除了你的答案。不要被downvote嚇倒。它來自領土。 –

+0

@DrewDormann我沒有被嚇到,而是投了票,接受了另一個答案,這意味着OP沒有聽取我的建議。如果他們願意的話,它會讓他們的生活變得更容易... – syb0rg

回答

2

如果Mat是真正灰色,它可能CV_8U類型:

for (int i = 0; i < gray.rows; i++) 
{ 
    for (int j = 0; j < gray.cols; j++) 
    { 
     byte pixel = gray.get(i, j); 
    } 
} 

我沒有我的環境設置來測試此代碼。欲瞭解更多信息,請查詢this thread

如果您正在使用JavaCV,前一段時間我寫了一個代碼,反覆彩色圖像的像素,並將其轉換爲灰度是這樣的:

IplImage imageSrc = cvLoadImage("pipeline.png", CV_LOAD_IMAGE_COLOR); 
    if (imageSrc == null) 
    { 
     System.out.println("!!! Failed loading image"); 
     return; 
    } 

    double r, g, b; 
    r = g = b = 0.0;    

    IplImage imageDst = IplImage.create(imageSrc.width(), imageSrc.height(), IPL_DEPTH_8U, 3); 

    CvMat imagePixels = CvMat.createHeader(imageDst.height(), imageDst.width(), CV_32FC1); 
    cvGetMat(imageDst, imagePixels, null, 0); 
    int x, y; 
    for(y=0; y<imageSrc.height(); y++) 
     for(x=0; x<imageSrc.width(); x++) 
     { 
      CvScalar rgb = cvGet2D(imagePixels, y, x); 
      r = rgb.val(0); 
      g = rgb.val(2); 
      b = rgb.val(1); 

      double gray = (r + g + b)/3; 

      CvScalar scalar = new CvScalar(); 
      scalar.setVal(0, gray); 
      scalar.setVal(1, gray); 
      scalar.setVal(2, gray); 
      cvSet2D(imagePixels, y, x, scalar); 
     } 
     imageDst = new IplImage(imagePixels); 

     IplImage result = new IplImage(imagePixels); 
     cvSaveImage("manual_gray.png", result); 

     cvReleaseImage(imageSrc); 
+0

使用JavaCV的+1。 – syb0rg

+0

@karlphillip你可以檢查這個問題http://stackoverflow.com/questions/29204124/how-to-iterate-in-opencv4android類似這個。 –