我正在尝试用otsu进行多阈值处理.我目前使用的方法实际上是通过最大化类间差异,我已经设法获得与OpenCV库相同的阈值.但是,这只是通过运行otsu方法一次.
关于如何进行多级阈值处理或者更确切地说是递归阈值处理的文档相当有限.获得原始otsu的价值后我该怎么办?会欣赏一些提示,我一直在玩代码,添加一个外部for循环,但计算的下一个值对于任何给定的图像总是254 :(
我的代码如果需要:
//compute histogram first
cv::Mat imageh; //image edited to grayscale for histogram purpose
//imageh=image; //to delete and uncomment below;
cv::cvtColor(image, imageh, CV_BGR2GRAY);
int histSize[1] = {256}; // number of bins
float hranges[2] = {0.0, 256.0}; // min andax pixel value
const float* ranges[1] = {hranges};
int channels[1] = {0}; // only 1 channel used
cv::MatND hist;
// Compute histogram
calcHist(&imageh, 1, channels, cv::Mat(), hist, 1, histSize, ranges);
IplImage* im = new IplImage(imageh);//assign the image to an IplImage …Run Code Online (Sandbox Code Playgroud) 我想问一下,是否有一种方法只能检测近乎水平的霍夫线或忽略那些几乎垂直的霍夫线?我现在的HoughLine代码如下所示:
HoughLinesP(imagec, lines, 80, CV_PI/2, CV_THRESH_OTSU|CV_THRESH_BINARY, 25, 7);
for(size_t i = 0; i < lines.size(); i++)
    {
      Vec4i l = lines[i];
      line(imagec, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255,255,255), 8, 8);
      line(imagelines, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255,255,255), 8, 8); //draw on black image as well
    }
Run Code Online (Sandbox Code Playgroud)
然而,在图像中,我只想检测水平线,或至少接近水平线,如2至4厘米.我CV_PI/2用于HoughLineP中的theta参数,因此也检测垂直线/近垂直线.
任何建议,代码示例等将不胜感激.谢谢.
定义我的问题有点困难,因为我不确定症状的名称,并且很难通过静态图像看到它.不过我还是要说明一下,希望大家都能明白这个问题.
具有水平阴影视频的实时视频,非常明显,但无法通过图像看到.但查看接下来的2张图片:

这里稍微明显一点(通过背景的abs diff(固定的静态图像)和当前的视频流),虽然你不得不眯着眼睛看它:

这里有点明显(通过对图像进行阈值处理.白色阴影在图像中上下移动):

好的,所以我不确定这个症状的名称是什么,我想知道,这是什么?这是什么原因?我怎么能解决它.
我尝试过的事:
增加和减少暴露
增加和减少分辨率
使用waitkey(),降低刷新率
每秒增加和减少帧数.
有人有任何想法吗?
我刚刚意识到,在大量搜索OpenCv中如何访问像素的强度值后,网上没有任何内容.灰度图像.
大多数在线搜索都是关于如何访问彩色图像的BGR值,如下所示:在openCV中访问某些像素RGB值
image.at <>基本上是3个通道,即BGR,出于好奇,是否有另一种类似的方法来自OpenCV访问灰度图像的某个像素值?
为了使我的问题更清楚,请查看代码.
vector<cv::Vec3b> v_char; // the vector that I am storing my r,g,b values, or b,g,r in this case since it's opencv.
Run Code Online (Sandbox Code Playgroud)
我知道打印出使用值的价值,我可以直接从图像中取出,就像这样.
b = image.at<cv::Vec3b>(i,j)[0];
g = image.at<cv::Vec3b>(i,j)[1];
r = image.at<cv::Vec3b>(i,j)[2];
Run Code Online (Sandbox Code Playgroud)
但是,没有使用图像(想象图像消失了),我只想要来自矢量的值,v_char所有的图像值都已存储,比如说,我只想要r值,我该怎么办找回来的?尝试在互联网上搜索并玩弄代码,但无济于事:(
编辑:更多细节向量,v_char只是存储图像的一行的值.例如:我想找到并打印出可以在v_char向量中找到的特定行的所有r值.我可以使用for循环,但是如何仅声明r值?