gpt4 book ai didi

c++ - 尝试在C++中实现运行长度平滑算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:51 27 4
gpt4 key购买 nike

这是我关于 RLSA in C++ 的旧问题, 但我还没有得到任何帮助。

我尝试将代码从 Matlab 实现到 C++

算法说明:

http://crblpocr.blogspot.fr/2007/06/run-length-smoothing-algorithm-rlsa.html http://crblpocr.blogspot.fr/2007/06/determination-of-run-length-smoothing.html

这个线程在 Matlab 中有 RLSA 实现:

http://mathworks.cn/matlabcentral/newsreader/view_thread/318198

MatLab代码

    hor_thresh=20;
zeros_count=0;
one_flag=0;
hor_image=image;
for i=1:m
for j=1:n
if(image(i,j)==1)
if(one_flag==1)
if(zeros_count<=hor_thresh)
hor_image(i,j-zeros_count:j-1)=1;
else
one_flag=0;
end
zeros_count=0;
end
one_flag=1;
else
if(one_flag==1)
zeros_count=zeros_count+1;
end
end
end
end

我尝试用C++代码实现

                int hor_thres = 22;
int one_count = 0;
int zero_flag = 0;
Mat tmpImg = Mat(Img.size(), CV_8UC1, Scalar(0, 0, 0));
for (int j = 0; j<Img.rows; j++){
for (int i = 0; i<Img.cols; j++){
if (Img.at<uchar>(j, i) == 0)
{
if (zero_flag == 1)
{
if (one_count <= hor_thres)
{
tmpText(cv::Range(j - zero_count, j), cv::Range(i, i+1)).setTo(cv::Scalar::all(255));
// I want to do the same thing in Matlab as this image(i,j-one_count:j-1)=0;
}
else
{
zero_flag = 1;
}
one_count = 0;
}
zero_flag = 1;
}
else
{
if (zero_flag == 1)
{
one_count = one_count + 1;
}
}
}
}

这次没有报错但是结果不是预期的..

问题是我想编写与

相同的 C++ 代码的方式

编程语言

tmpImg(i,j-one_count:j-1)=0;

C++

tmpText(cv::Range(j - zero_count, j), cv::Range(i, i+1)).setTo(cv::Scalar::all(255));

有什么想法吗???

另一件事是在 Matlab 中索引从 1 开始,而 C++ 从 0 开始。

感谢

最佳答案

OpenCV 按行/列索引,而不是 x/y,所以改为这样做:

if (tmpText.at<uchar>(j, i) == 0)
^^^^

您需要修复使用 at<T>(row,col) 的其余代码功能也一样。

关于c++ - 尝试在C++中实现运行长度平滑算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21607017/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com