opencv c++ 以灰度图方式加载一张图片,并统计该图像素的最大值、最小值、均值以及方差,完整代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv c++ 以灰度图方式加载一张图片,并统计该图像素的最大值、最小值、均值以及方差,完整代码相关的知识,希望对你有一定的参考价值。
参考技术A void main()IplImage *src = cvLoadImage("xxx",1);
int width = src->width;
int height = src->height;
uchar *ptr = src->imageData;
int Iij;
double Imax = 0, Imin = 255, Iave = 0, Idelta = 0;
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
Iij = (int) ptr[i*width+j];
if(Iij > Imax)
Imax = Iij;
if(Iij < Imin)
Imin = Iij;
Iave = Iave + Iij;
Iave = Iave/(width*height);
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
Iij = (int) ptr[i*width+j];
Idelta = Idelta + (Iij-Iave)*(Iij-Iave);
Idelta = Idelta/(width*height);
printf("灰度最大值 = %d\n",Imax);
printf("灰度最小值 = %d\n",Imin);
printf("灰度均值 = %d\n",Iave);
printf("灰度方差 = %d\n",Idelta);
return;
追问
解决了,谢谢你啦!
本回答被提问者采纳 参考技术B 不及到耶!!!!!!!!!!!!!!!!!!!!!!Qt + OpenCV 灰度错误
【中文标题】Qt + OpenCV 灰度错误【英文标题】:Qt + OpenCV grayscale error 【发布时间】:2012-09-19 12:51:09 【问题描述】:我一直在尝试为使用 OpenCV 和 C++ 的图像处理任务创建一个简单的界面,并使用 Qt 作为 GUI。 我可以通过 GUI 加载图像,但是当我按下 pushbutton_3 时, 将图像转换为灰度会导致有关 OpenCV 的错误。 我确定我做错了什么。有人可以帮帮我吗?
请看下面的文件:
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QFileDialog>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <vector>
#include <QtCore/QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/types_c.h>
#include <opencv2/imgproc/imgproc.hpp>
namespace Ui
class MainWindow;
class MainWindow : public QMainWindow
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
void on_pushButton_3_clicked();
private:
Ui::MainWindow *ui;
//Images variables
cv::Mat image_Idl;
cv::Mat image_Lit;
cv::Mat image_Idl_G;
cv::Mat image_Lit_G;
double threshHold;
;
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <QtCore/QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/types_c.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <QSpinBox>
#include <QSlider>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
ui->setupUi(this);
ui->horizontalSlider->setRange(0,255);
ui->spinBox->setRange(0,255);
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),ui->spinBox,SLOT(setValue(int)));
connect(ui->spinBox,SIGNAL(valueChanged(int)),ui->horizontalSlider,SLOT(setValue(int)));
MainWindow::~MainWindow()
delete ui;
void MainWindow::on_pushButton_clicked()
QString fileName = QFileDialog::getOpenFileName(this,tr("Load Lit Image"),".",tr("Image Files (*.png *.jpg *.jpeg *.bmp)"));
image_Lit = cv::imread(fileName.toAscii().data());
cv::namedWindow("Lit Image");
cv::imshow("Lit Image", image_Lit);
void MainWindow::on_pushButton_2_clicked()
QString fileName = QFileDialog::getOpenFileName(this,tr("Load Lit Image"),".",tr("Image Files (*.png *.jpg *.jpeg *.bmp)"));
image_Idl = cv::imread(fileName.toAscii().data());
cv::namedWindow("Ideal Lit");
cv::imshow("Ideal Lit", image_Idl);
void MainWindow::on_pushButton_3_clicked()
//Converstions
//Convert Lit to gray
cv::cvtColor(image_Lit, image_Lit_G,CV_RGB2GRAY);
//Convert Ideal gray
cv::cvtColor(image_Idl, image_Idl_G,CV_RGB2GRAY);
//Threshold the Images to a designated value
// Lit
threshHold = ui->horizontalSlider->value();
cv::threshold(image_Lit_G,image_Lit_G, threshHold,255,cv::THRESH_BINARY);
cv::namedWindow("Gray Scaled Image");
cv::imshow("Gray Scaled Image", image_Lit_G);
编译器出错:
传递给 C 运行时函数的参数无效。 传递给 C 运行时函数的参数无效。 OpenCV 错误:cvtColor 中的断言失败 (scn == 3 || scn == 4),文件 C:\OpenCV\modules\imgproc\src\color.cpp,第 2834 行 程序意外结束。
弹窗错误:
Microsoft Visual C++
此应用程序按请求以异常方式终止。
【问题讨论】:
你得到什么错误?仅从您的头文件中猜测几乎是不可能的(我认为这与问题没有任何关系)。 您能否更具体一点“给出错误”?您提供的代码也不足以诊断您的问题。 您能否发布将图像从 OpenCV 格式转换为 Qt imge(或您用于在 Qt 中显示图像的任何内容)的代码部分? 抱歉,伙计们,我刚刚注意到我的复制粘贴不成功。我正在编辑和更新缺失的信息。 刚刚更新。不幸的是,系统不允许我发布图片... 【参考方案1】:#include "iostream"
#include "cv.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
Mat image = imread("C:\\lena.jpg");
cvtColor(image,image,CV_RGB2GRAY);
imshow("test",image);
waitKey();
return 0;
上面的代码(Qt 中的控制台应用程序..)正在运行..它显示灰色图像...尝试包含 cv.h 文件...
【讨论】:
是的,上面的代码有效。我用纯 c++ 制作了 inteire 程序并且可以工作。我遇到的问题是添加执行我在纯编码中执行的功能的 GUI。我创建了一个按钮(pushbutton_3)来执行几个功能,例如将图像转换为灰度,阈值查找轮廓等。问题是当我按下按钮时,它在第一个操作中给出错误,在这种情况下是转换图像到灰度。 你用 IplImage 尝试过 C 接口吗? 我不懂C接口。 大家好,除了 C 接口之外,我已经尝试了你所有的建议,但都失败了 :(。不幸的是,我没有更多的权限来发布 GUI 的图像,因为我没有足够的权限这样做是正确的。我已经发布了我制作的所有代码。【参考方案2】:我在更新我的 windows7 机器后重新编译了上面的程序,令人惊讶的是它的工作原理! 真的很奇怪......我没有对程序进行任何更改(至少我不记得做了任何明显不同的事情)但是在重新安装comodo firewal之后它工作...... 谢谢你们,你们的帮助。
【讨论】:
以上是关于opencv c++ 以灰度图方式加载一张图片,并统计该图像素的最大值、最小值、均值以及方差,完整代码的主要内容,如果未能解决你的问题,请参考以下文章
python使用OpenCV加载图像为灰度图(图像原本为彩色图)并可视化灰度图像(Load image as grayscale and show image)