- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经多次阅读 calcHist() 的文档,但我认为我对 OpenCV 的缺乏经验和生疏的编程技能完全使我无法理解它。
我正在计算 HSV 图像(Hue 或 channel [0])的一个 channel 中的像素以用于分割目的,使用 10 个接近颜色的 bin 根据类似的东西(让我们以此为例,我偷了网络之外的范围 - fwiw,省略紫红色似乎是错误的):
红色:0-19 和 330-360红黄 (RY):20-49黄色:50-69YG:70-84绿色:85-170国标:171-191蓝色:192-264英国石油公司:265-289紫色:290-329
等等……
那么我该如何使用 calcHist 做到这一点呢?
我目前为止:
#include <opencv2/opencv.hpp>
#include <vector>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
Mat scene, sceneHSV, dest, histo;
int numImages = 1, histChannel[] = {0}, dims = 1, histSize[] = {10};
float redRange[] = {0, 10};
float roRange[] = {10, 25};
float orangeRange[] = {25, 35};
float oyRange[] = {35, 42};
float yellowRange[] = {42, 85};
float ygRange[] = {85, 96};
float greenRange[] = {96, 132};
float gbRange[] = {132, 145};
float blueRange[] = {145, 160};
float bpRange[] = {160, 165};
float purpleRange[] = {165, 180};
const float* ranges[] = {redRange, roRange, orangeRange, oyRange, yellowRange, ygRange, greenRange, gbRange, blueRange, bpRange, purpleRange};
vector<Mat> channels;
scene = imread("Apple.jpg", 1);
if (scene.data == NULL)
{
cout<<"FAIL"<<endl;
cin.get();
}
cvtColor(scene, sceneHSV, CV_BGR2HSV);
dilate(sceneHSV, sceneHSV, Mat(), Point(-1, -1), 1, BORDER_CONSTANT, 1);
pyrMeanShiftFiltering(sceneHSV, dest, 2, 50, 3);
split(sceneHSV, channels);
calcHist(&scene, 1, histChannel, Mat(), histo, dims, histSize, ranges, false, false);
cout<<histo<<endl;
waitKey(0);
return 0;
}
现在呢?在这种情况下,calcHist 的参数是什么样的,输出直方图是什么样的?只是一个充满整数的 1x9 数组?
非常感谢。
最佳答案
我修改了 here 中的代码
您可能还想查看 cvtColor here 的文档
请注意,我没有尝试编译或运行这段代码,所以我不保证它会工作。但尽管如此,它作为引用还是很有用的。
Mat hist;
int nimages = 1; // Only 1 image, that is the Mat scene.
int channels[] = {0} // Index for hue channel
int dims = 1 // Only 1 channel, the hue channel
int histSize[] = {9} // 9 bins, 1 each for Red, RY, Yellow, YG etc.
float hranges[] = { 0, 180 }; // hue varies from 0 to 179, see cvtColor
const float *ranges[] = {hranges};
// Compute the histogram.
calcHist(&scene,
nimages,
channels,
Mat(), // No mask
hist, dims, histSize, ranges, uniform=true)
// Now hist will contain the counts in each bin.
// Lets just print out the values. Note that you can output Mat using std::cout
cout << "Histogram: " << endl << hist << endl;
// To access the individual bins, you can either iterate over them
// or use hist.at<uchar>(i, j); Note that one of the index should be 0
// because hist is 1D histogram. Print out hist.rows and hist.cols to see if hist is a N x 1 or 1 x N matrix.
/*
MatIterator_<uchar> it, end;
int binIndex = 0;
for( it = hist.begin<uchar>(), end = hist.end<uchar>(); it != end; ++it)
{
printf("Count in %d bin: %d\n", binIndex, *it);
++binIndex;
}
*/
关于c++ - OpenCV - 使用 calcHist 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15211387/
我有这样的事情: import numpy as np import cv2 as cv from matplotlib import pyplot as plt import numpy.polyn
我正在使用 calcHist 函数计算图像的颜色直方图。我正在开发一个简单的图像匹配应用程序,我正在尝试使用颜色直方图作为图像描述符来查找相似图像。 这是定义: void calcHist(const
尝试使用带掩码的 calcHist 时出现此错误:error: (-215) mask.size() == imsize && mask.channels() == 1 in function his
我正在努力学习equalization of histograms , 我当然知道有 histogram equalization in OpenCV .我是iterating over the Ma
我正在尝试使用 OpenCV 的 Emgu C# 包装器为图像的反向投影创建直方图。我有以下 OpenCV C++ 代码,我正在尝试将其转换为 Emgu C#: char* filename = (c
我有这段代码用于计算和绘制图像的直方图。 colors = ('b', 'g', 'r') for i, col in enumerate(colors): hist = cv2.calcHi
在尝试使用 cv2.calcHist() 时,我遇到了以下不明确的错误 >>> img array([ 1., 2., 3., 4., 5.]) >>> cv2.calcHist( [img]
我试图了解 cvCalcHist 之间的区别,openCV c 版本 和 calcHist 中计算图像直方图的方法>,openCV c++ version 中计算图像直方图的方法。 openCV c版
我试图从 OpenCV 中的彩色(3 channel )图像中获取直方图,但每次我都像这样执行 calcHist 直方图: //int histSize[3]; //float hranges[2];
我已经多次阅读 calcHist() 的文档,但我认为我对 OpenCV 的缺乏经验和生疏的编程技能完全使我无法理解它。 我正在计算 HSV 图像(Hue 或 channel [0])的一个 chan
我想做的是编写一个函数来计算灰度图像的直方图,其中转发的 Bins 数 (anzBin) 直方图范围被划分为。然后我运行图像像素以匹配它们将值分配给不同的 Bins,如果某个值适合,则将 Bin 的值
我正在尝试让一些 C++ 代码在我的 Android 设备上运行;但是,我遇到了 Mat 类型的一个小问题。我在用着。我尝试转换的代码如下(第二个函数调用第一个): static Mat histc_
我在“OpenCV 2 计算机视觉应用程序编程手册”一书第 4 章中运行一个示例。calcHist 返回的只有 2 个直方图是黑色的,并且遵循源代码。运行结果如下图。 ColorHistogram()
我正在使用上面的代码从灰度图像计算直方图;它工作正常。 cv::Mat imgSrc = cv::imread("Image.jpg", cv::IMREAD_UNCHANGED); cv::Mat
我正在尝试计算仅由一行组成的矩阵的直方图。我使用 OpenCV3.1 在 VS2015 中编写了这段代码: //Create matrix stromal pop cv::Mat stromalHis
我想计算图像的颜色直方图,但只考虑特定像素(我知道其二维坐标)。 是否可以使用 calcHist 指定仅应考虑这些具体像素(而不是整个 cv::Mat 和其中的所有像素)?如果没有,是否可以创建一个新
我是计算机视觉的新手,这是我的第一份作业。我正在尝试创建与文件夹中的每个图像相对应的 rgb 直方图。假设我在 test 文件夹(位于我当前的工作目录中)中有 10 张图片。我想为每个图像创建 10
我有计算 hsv 和 yuv 图像直方图的代码。由于我试图单独获取与亮度对应的值,因此我想要来自 hsv 图像的“v” channel 值和来自 yuv 图像的亮度(“y”) channel 值。这是
这里有很多关于 OpenCV 中的 calcHist 的问题,但我找不到我的问题的答案,并且已经多次阅读文档,所以希望有人可以通过以下代码发现我的问题: //the setup is that I'v
我正在尝试使用以下代码: cv::MatND hist; cv::Mat image = cv::imread("image.bmp"); float *range = new
我是一名优秀的程序员,十分优秀!