在Java绑定中通过OpenCV Mat循环
我正在尝试将C ++方法从我之前使用OpenCV收到的答案转换为使用OpenCV Java绑定的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 points; cv::Mat_::iterator it = gray.begin(); cv::Mat_::iterator end = gray.end(); 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 p = new ArrayList(); //How to loop through the gray variable?
我浏览了API ,似乎Mat
确实有获取rows
和rows
方法,但我不能在任何事情上调用Iterator
。
如果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); } }
我没有我的环境设置来测试此代码。 有关更多信息,请查看此主题 。
如果您使用的是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