Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于OpenCV中心的直方图 我试图建立一个基于中心的直方图,这意味着中间的RGB图像的值更重要。我写了下面的代码,但根据OpenCV自己的直方图函数,它非常慢。有什么办法能让这一切快点吗 void calc_histogram(cv::Mat& image, cv::Mat& histogram) { int bit = 8; int max_value = pow(2, bit); int n_blue_bin = 8; int n_green_bin = 8; int n_red_bin = 8; int blue_width = max_value / n_blue_bin; int green_width = max_value / n_green_bin; int red_width = max_value / n_red_bin; int mySizes[3]={n_blue_bin, n_green_bin, n_red_bin}; histogram = Mat::zeros(3,mySizes,CV_32F); int blue, green, red; int blue_bin, green_bin, red_bin; float k, length; float max_length = sqrt((image.rows/2)*(image.rows/2) + (image.cols/2)*(image.cols/2)); for(int i = 0 ; i < image.rows ; i++) { for(int j = 0 ; j < image.cols ; j++) { length = sqrt(abs(image.rows/2 - i)*abs(image.rows/2 - i) + abs(image.cols/2 - j)*abs(image.cols/2 - j)) / max_length; k = sqrt(1-length); Vec3b intensity = image.at<Vec3b>(i, j); blue = intensity.val[0]; green = intensity.val[1]; red = intensity.val[2]; blue_bin = blue / blue_width; green_bin = green / green_width; red_bin = red / red_width; histogram.at<float>(blue_bin, green_bin, red_bin) += k; } } } void calc_直方图(cv::Mat&image,cv::Mat&直方图) { int位=8; int max_值=功率(2位); int n_blue_bin=8; int n_green_bin=8; int n_red_bin=8; int blue\u width=最大值/n\u blue\u bin; int green\u width=最大值/n\u green\u bin; int red_width=最大值/n_red_bin; int mySizes[3]={n_blue_bin,n_green_bin,n_red_bin}; 直方图=Mat::零(3,mySizes,CV_32F); 蓝色、绿色、红色; 内部蓝色垃圾桶、绿色垃圾桶、红色垃圾桶; 浮动k,长度; float max_length=sqrt((image.rows/2)*(image.rows/2)+(image.cols/2)*(image.cols/2)); 对于(int i=0;i_C++_Opencv - Fatal编程技术网

C++ 基于OpenCV中心的直方图 我试图建立一个基于中心的直方图,这意味着中间的RGB图像的值更重要。我写了下面的代码,但根据OpenCV自己的直方图函数,它非常慢。有什么办法能让这一切快点吗 void calc_histogram(cv::Mat& image, cv::Mat& histogram) { int bit = 8; int max_value = pow(2, bit); int n_blue_bin = 8; int n_green_bin = 8; int n_red_bin = 8; int blue_width = max_value / n_blue_bin; int green_width = max_value / n_green_bin; int red_width = max_value / n_red_bin; int mySizes[3]={n_blue_bin, n_green_bin, n_red_bin}; histogram = Mat::zeros(3,mySizes,CV_32F); int blue, green, red; int blue_bin, green_bin, red_bin; float k, length; float max_length = sqrt((image.rows/2)*(image.rows/2) + (image.cols/2)*(image.cols/2)); for(int i = 0 ; i < image.rows ; i++) { for(int j = 0 ; j < image.cols ; j++) { length = sqrt(abs(image.rows/2 - i)*abs(image.rows/2 - i) + abs(image.cols/2 - j)*abs(image.cols/2 - j)) / max_length; k = sqrt(1-length); Vec3b intensity = image.at<Vec3b>(i, j); blue = intensity.val[0]; green = intensity.val[1]; red = intensity.val[2]; blue_bin = blue / blue_width; green_bin = green / green_width; red_bin = red / red_width; histogram.at<float>(blue_bin, green_bin, red_bin) += k; } } } void calc_直方图(cv::Mat&image,cv::Mat&直方图) { int位=8; int max_值=功率(2位); int n_blue_bin=8; int n_green_bin=8; int n_red_bin=8; int blue\u width=最大值/n\u blue\u bin; int green\u width=最大值/n\u green\u bin; int red_width=最大值/n_red_bin; int mySizes[3]={n_blue_bin,n_green_bin,n_red_bin}; 直方图=Mat::零(3,mySizes,CV_32F); 蓝色、绿色、红色; 内部蓝色垃圾桶、绿色垃圾桶、红色垃圾桶; 浮动k,长度; float max_length=sqrt((image.rows/2)*(image.rows/2)+(image.cols/2)*(image.cols/2)); 对于(int i=0;i

C++ 基于OpenCV中心的直方图 我试图建立一个基于中心的直方图,这意味着中间的RGB图像的值更重要。我写了下面的代码,但根据OpenCV自己的直方图函数,它非常慢。有什么办法能让这一切快点吗 void calc_histogram(cv::Mat& image, cv::Mat& histogram) { int bit = 8; int max_value = pow(2, bit); int n_blue_bin = 8; int n_green_bin = 8; int n_red_bin = 8; int blue_width = max_value / n_blue_bin; int green_width = max_value / n_green_bin; int red_width = max_value / n_red_bin; int mySizes[3]={n_blue_bin, n_green_bin, n_red_bin}; histogram = Mat::zeros(3,mySizes,CV_32F); int blue, green, red; int blue_bin, green_bin, red_bin; float k, length; float max_length = sqrt((image.rows/2)*(image.rows/2) + (image.cols/2)*(image.cols/2)); for(int i = 0 ; i < image.rows ; i++) { for(int j = 0 ; j < image.cols ; j++) { length = sqrt(abs(image.rows/2 - i)*abs(image.rows/2 - i) + abs(image.cols/2 - j)*abs(image.cols/2 - j)) / max_length; k = sqrt(1-length); Vec3b intensity = image.at<Vec3b>(i, j); blue = intensity.val[0]; green = intensity.val[1]; red = intensity.val[2]; blue_bin = blue / blue_width; green_bin = green / green_width; red_bin = red / red_width; histogram.at<float>(blue_bin, green_bin, red_bin) += k; } } } void calc_直方图(cv::Mat&image,cv::Mat&直方图) { int位=8; int max_值=功率(2位); int n_blue_bin=8; int n_green_bin=8; int n_red_bin=8; int blue\u width=最大值/n\u blue\u bin; int green\u width=最大值/n\u green\u bin; int red_width=最大值/n_red_bin; int mySizes[3]={n_blue_bin,n_green_bin,n_red_bin}; 直方图=Mat::零(3,mySizes,CV_32F); 蓝色、绿色、红色; 内部蓝色垃圾桶、绿色垃圾桶、红色垃圾桶; 浮动k,长度; float max_length=sqrt((image.rows/2)*(image.rows/2)+(image.cols/2)*(image.cols/2)); 对于(int i=0;i,c++,opencv,C++,Opencv,我觉得这不是直方图函数:你的结果真的应该是8x8矩阵吗?柱状图通常为3xN。要添加,请执行直方图[0][red]+=k;直方图[1][绿色]+=k;直方图[2][蓝色]+=k;通常k=1,但在你的情况下,它是一个重量。也许我读错了opencv 此外,你还做了很多多余的工作:为什么要在健身前做腹肌?当你能用倒数相乘时,千万不要除法。迭代y,然后迭代x。不要使用at,而是获取指针 我觉得这不是直方图函数:你的结果真的应该是8x8矩阵吗?柱状图通常为3xN。要添加,请执行直方图[0][red]+=k;

我觉得这不是直方图函数:你的结果真的应该是8x8矩阵吗?柱状图通常为3xN。要添加,请执行直方图[0][red]+=k;直方图[1][绿色]+=k;直方图[2][蓝色]+=k;通常k=1,但在你的情况下,它是一个重量。也许我读错了opencv


此外,你还做了很多多余的工作:为什么要在健身前做腹肌?当你能用倒数相乘时,千万不要除法。迭代y,然后迭代x。不要使用at,而是获取指针

我觉得这不是直方图函数:你的结果真的应该是8x8矩阵吗?柱状图通常为3xN。要添加,请执行直方图[0][red]+=k;直方图[1][绿色]+=k;直方图[2][蓝色]+=k;通常k=1,但在你的情况下,它是一个重量。也许我读错了opencv


此外,你还做了很多多余的工作:为什么要在健身前做腹肌?当你能用倒数相乘时,千万不要除法。迭代y,然后迭代x。不要使用at,而是获取指针

你分析过你的代码吗?这通常是一个好的开始。我怀疑在您的内部循环中对
sqrt()
的两个调用很可能是主要的嫌疑犯…@TobySpeight它们可能是,但我认为它们是必要的。您分析过您的代码吗?这通常是一个好的开始。我怀疑在您的内部循环中对
sqrt()
的两个调用可能是主要的嫌疑犯,当您这样做时…@TobySpeight它们可能是,但我认为它们是必要的。是的,我得到了我想要的8x88矩阵,值没有问题。是的,我正在做一些与平常不同的事情。关于abs()你是对的。我会修好的。但是我没有得到倒数,而且部分是。@JennySimon倒数:乘以1/x比除以x快得多。预先计算这些。At:使用.ptr(行)代替At。在内部循环中翻转循环以转到列。然后每行执行一次ptr,并索引myptr[col]。另外,请重新思考您对sqrt的使用。你不能用平方长度代替两个根吗?是的,我得到了一个我想要的8x8矩阵,值没有问题。是的,我正在做一些与平常不同的事情。关于abs()你是对的。我会修好的。但是我没有得到倒数,而且部分是。@JennySimon倒数:乘以1/x比除以x快得多。预先计算这些。At:使用.ptr(行)代替At。在内部循环中翻转循环以转到列。然后每行执行一次ptr,并索引myptr[col]。另外,请重新思考您对sqrt的使用。你不能用平方长度代替两个根吗?