在Java绑定中通过OpenCV Mat循环 我试图用OpenCV Java绑定< /P>将一个C++方法从一个OpenCV接收到的java转换成java。

在Java绑定中通过OpenCV Mat循环 我试图用OpenCV Java绑定< /P>将一个C++方法从一个OpenCV接收到的java转换成java。,java,c++,opencv,image-processing,javacv,Java,C++,Opencv,Image Processing,Javacv,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

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()); 
}

我看了一遍,似乎
Mat
确实有方法获取
cols
,但我不能调用任何东西的
迭代器。

如果
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);
    }
}
for(int i=0;i
我没有测试此代码的环境设置。有关更多信息,请查看

如果您使用的是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); 
IplImage-imageSrc=cvLoadImage(“pipeline.png”,CV\u-LOAD\u-IMAGE\u-COLOR);
if(imageSrc==null)
{
System.out.println(!!!加载图像失败);
返回;
}
双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;

对于(y=0;y就像我以前告诉过你的,使用JavaCV。@syb0rg看起来你以前删除了你的答案。不要被否决票吓到了。这是有地域性的。@DrewDormann我没有被吓到,它被否决了,另一个答案被接受了,这意味着OP没有听我的建议。如果他们愿意的话,他们的生活会轻松得多。。。@syb0rg我尝试了JavaCV,但是,它没有我想要的一些方法。例如
getStructuringElement
。可能它们对该方法有不同的名称,但我找不到它。经历了这些痛苦之后,我决定尝试一下OpenCV java绑定,因为它们与C函数的匹配率为1:1至少。@karlphillip你能和这个问题核对一下吗。
    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);