如何在JavaCV中转换Cvmat的元素

时间:2012-10-16 19:13:26

标签: opencv shift javacv

及时我正在写一点seam-carving - 申请

我的问题是以有效的方式从图像中删除检测到的“接缝”。

我有以下代码:

    private void removePathFromImageV(CvMat img, int[] path){

    int band = 3;

    double ch = 0.0;
        for (int y = 0; y < img.rows()-1; ++y){
            for (int x = path[y]-1; x < img.cols()-1; ++x){

                for (int b = 0; b < band; ++b){
                ch = img.get(y,x+1,b);
                img.put(y,x,b,ch);
            }
        }
    }

}

是否可以选择将元素从路径[y] -1切换到img.cols() - 1?

问候

1 个答案:

答案 0 :(得分:2)

您的问题是您必须为每一行抑制不同位置的像素,并且使用图像结构来执行此操作效率不高,因为您必须在删除的像素之后移动所有像素。您可以尝试将整个图像转换为对删除操作有效的数据结构,例如在C ++中,std::deque,一个带有随机访问迭代器的双端队列。然后,您可以轻松地抑制每行中的元素。最后,您可以从结构中复制回适当的图像。

这是C ++中的想法

// assuming image is a CV_8UC3 image
std::deque<std::deque<cv::Vec3b> > pixelsDeq(image.rows, std::deque<cv::Vec3b>(image.cols));
for (int i = 0; i < image.rows; ++i)
  for (int j = 0; j < image.cols; ++j)
    pixelsDeq[i][j] = image.at<cv::Vec3b>(i, j);

// then remove pixels from the path (remove sequentially for all the paths you probably have)
  for (int j = 0; j < image.rows; ++j) {
    pixelsDeq[j].erase(pixelsDeq[j].begin() + paths[j]);


// at the end, copy back to a proper image
cv::Mat output = cv::Mat::zeros(pixelsDeq.size(), pixelsDeq[0].size(), CV_8UC3);
for (int i = 0; i < output.rows; ++i) {
  for (int j = 0; j < output.cols; ++j) {
    output.at<cv::Vec3b>(i,j) = pixelsDeq[i][j];
  } 
}