Opencv 如何在JavaCV中移动Cvmat的元素

Opencv 如何在JavaCV中移动Cvmat的元素,opencv,shift,javacv,Opencv,Shift,Javacv,最后,我正在编写一个小小的接缝雕刻-应用程序 我的问题是以一种有效的方式从图像中删除检测到的“接缝” 我有以下代码: private void removepath fromImageV(CvMat img,int[]路径){ int波段=3; 双ch=0.0; 对于(int y=0;y

最后,我正在编写一个小小的
接缝雕刻
-应用程序

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

我有以下代码:

private void removepath fromImageV(CvMat img,int[]路径){
int波段=3;
双ch=0.0;
对于(int y=0;y
是否有将元素从路径[y]-1移动到img.cols()-1的选项


问候语

您的问题是,必须在每行的不同位置抑制像素,而使用图像结构来抑制像素是没有效率的,因为必须在删除像素后移动所有像素。你可以尝试将你的整个图像转换成一个高效的数据结构,例如C++, STD::DEQu< /COD>,一个具有随机访问迭代器的双端队列。然后可以轻松地抑制每行中的元素。最后,您可以将结构复制回正确的图像

这是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];
  } 
}
//假设图像是CV\u 8UC3图像
std::deque pixelsDeq(image.rows,std::deque(image.cols));
对于(int i=0;i
我不这么认为。您是否担心实际实现的效率?是的,我需要一个加速…随着时间的推移,这个解决方案会变慢,并且需要很多时间来解决大型图像的此函数。对于这种操作,AVA非常慢。我会使用JNI来加速。感谢代码片段,这是一个新的思维练习。我会的请参阅在java或jni中实现类似的功能。查看在java中实现集合接口的模板容器,您也可以这样做,但我对java不太了解