怎么用opencv获取网络摄像头摄像头的像素数据

09-1409-1209-0609-04
03-2004-1203-2104-06
◇本站云标签
◇热点推荐我使用的opencv版本是249的,因为感觉使用VideoCapture类来控制摄像头输出图像并且保存比较容易,所以一直使用这个类,但是却出现一个问题。
在使用这个类的capture.set(CV_CAP_PROP_FRAME_WIDTH,w)和capture.set(CV_CAP_PROP_FRAME_HEIGHT,h)来设置摄像头分辨率的时候总是
失败,出的一直是默认的640*480的图像,没有办法设置高清分辨率(在摄像头支持更高分辨率的情况下)。
最后才知道使用
cvSetCaptureProperty(camera , CV_CAP_PROP_FRAME_WIDTH , 2048);
cvSetCaptureProperty(camera , CV_CAP_PROP_FRAME_HEIGHT , 1536);
这两个函数来设置分辨率是可以的,但是摄像头需要使用CvCapture这个结构体来表示。
完整代码如下
int _tmain(int argc, _TCHAR* argv[])
cout &&&Camera ID:&;
CvCapture *camera = cvCaptureFromCAM(id);
if(NULL == camera){
cout &&&打开摄像头失败&&&
cvSetCaptureProperty(camera , CV_CAP_PROP_FRAME_WIDTH , 2048);
cvSetCaptureProperty(camera , CV_CAP_PROP_FRAME_HEIGHT , 1536);
IplImage * img = cvQueryFrame(camera);
cvSaveImage(&C:\\Aratek.jpg&,img);
cvShowImage(&aratek&,img);
waitKey(20);
本文已收录于以下专栏:
相关文章推荐
opencv读取百万高清摄像头。先设置摄像头分辨率。设置摄像机的分辨率是没有问题的。如果你使用其他软件,打开摄像机采集图像时出现了问题。问题就是您读取得图像是条状重要提示ERROT: SampleCB...
最近用双目视觉采集图像时得到的是640*480的图片,而我想要的是320*240的通过在网上查阅发现cvSetCaptureProperty函数可以达到我想要的效果:
cvSetCapturePro...
先看效果图再上代码,这是所获取的摄像头参数
这是修改了曝光值后的效果:
温馨提示:想要修改这些参数之前请一定一定一定要记住你摄像头参数的初始值,因为一旦你修改了这些参数你的摄像头就被改动了,是...
使用函数cv::VideoCapture::set()函数设置摄像头的分辨率
#include &cartoon.h&
int main()
VideoCapture capture...
本程序通过JFrame实时显示本机摄像头图像,并将图像存储到一个缓冲区,当用户用鼠标点击JFrame中任何区域时,显示抓取图像的简单动画,同时保存缓冲区的图像到磁盘文件中。点击JFrame关闭按钮可以...
在学习OpenCV的过程中遇到这样一个问题,利用OpenCV提供的函数无法修改摄像头采集的分辨率。后来经过google,baidu,终于得到了一种解决方案,现总结如下,如果大家有其它好的办法请给我发一...
根据之前的博客已经配置好了vs2013与opencv2.4.11
那来一个实例程序用来调用摄像头(笔记本)
代码如下:#include &stdafx.h&
#include &iostream&...
由于在程序的前面定义了全局变量CvCapture*,所以capture默认值为零,这段代码开始执行时,首先进入第一个if语句,参照
CvCapture* pCapture=NULL;
pCapture = cvCreateCameraCapture(-1);
if(pCapture == NULL)
他的最新文章
讲师:姜飞俊
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 956 人关注过本帖
标题:opencv里像素点获取和染色
等 级:新手上路
帖 子:11
结帖率:33.33%
&&已结贴√
&&问题点数:10&&回复次数:2&&&
opencv里像素点获取和染色
程序代码:#include &stdio.h&
#include &cv.h&
#include &highgui.h&
#define IMAGE_SIZE 1000
int mSetTest(double c_re, double c_im)
&&& int N=<font color=#;
&&& double real=<font color=#,comp=<font color=#;
&&& int i=<font color=#;
&&& while(N&<font color=#&&i&<font color=#)
&&&&&&&&N=real*real+comp*
&&&&&&&&real=real*real-comp*comp+c_
&&&&&&&&comp=<font color=#*real*comp+c_
&&&&&&&&i++;
&&& if(i&<font color=#) return i-<font color=#;
&&& else return <font color=#;
int main(int argc, char *argv[])
&&& IplImage *pImg =
&&&&&&&&cvCreateImage (cvSize (IMAGE_SIZE, IMAGE_SIZE), <font color=#, <font color=#);
&&& cvNamedWindow (&mandelbrot&, <font color=#);
&&& cvShowImage (&mandbrot&, pImg);
&&& for(int i=<font color=#; i&IMAGE_SIZE; i++)
&&&&&&&&for(int j=<font color=#; j&IMAGE_SIZE; j++)
&&&&&&&&&&&&int m=mSetTest(i,j);
&&&&&&&&&&&&if(m==<font color=#)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&& sca.val[<font color=#]=<font color=#; //blue
&&&&&&&&&&&&&&& sca.val[<font color=#]=<font color=#; //green
&&&&&&&&&&&&&&& sca.val[<font color=#]=<font color=#; //red
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&& sca.val[<font color=#]=<font color=#;
&&&&&&&&&&&&&&& sca.val[<font color=#]=<font color=#;
&&&&&&&&&&&&&&& sca.val[<font color=#]=<font color=#;
&&&&&&&&&&&&}
&&& cvWaitKey (<font color=#);
&&& cvDestroyWindow (&mandlbrot&);
&&& cvReleaseImage(&pImg);
&&& return <font color=#;
搜索更多相关主题的帖子:
等 级:新手上路
帖 子:11
弹出的是灰框,求助哪里有问题
等 级:版主
威 望:211
帖 子:5065
专家分:27816
&&得分:10&
我不知道你的 mSetTest函数 是干什么的,也就是 mSetTest(0,0) 和 mSetTest(0,1) 会返回0,其他都返回-1。
但 cvNamedWindow (&mandelbrot&, 1); cvShowImage (&mandbrot&, pImg); 中一个是“mandelbrot”,另一个是“mandbrot”,这是什么意思?
cvShowImage (&mandbrot&, pImg); 在你的for之前调用,这又是什么意思,显示修改前的图像吗?如果是,那你后面修改它干什么,你又不显示修改后的图像。
你的for函数不停的修改sca又在干什么,我觉得你的代码处处透出莫名其妙,你想修改pImg应该调用cvSet2D( pImg, i, j, sca )。
版权所有,并保留所有权利。
Powered by , Processed in 0.037719 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved【从零学习openCV】使用直方图统计像素
1. 计算图像直方图
图像是由像素组成的,在一个单通道的灰度图像中,每个像素的&#20540;介于0到255之间,而直方图就是一个简单的表,给出了一幅或者一组图像中拥有给定数&#20540;的像素数量。当然直方图也可以归一化,归一化后的所有项的和为1,在这种情况下,每一项给出的都是拥有特定数&#20540;的像素在图像中占的比例。
下面我们看看如何用opencv计算单通道图像的直方图,我用一个Histogram1D封装了与单通道直方图操作相关的变量和函数:
#ifndef HISTOGRAM1D_H
#define HISTOGRAM1D_H
#include &opencv2/core/core.hpp&
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/imgproc/imgproc.hpp&
class Histogram1D{
int histSize[1];
//项的数量
float hranges[2];
//像素的最小及最大值
const float* ranges[1];
int channels[1];
//仅用到一个通道
Histogram1D(){
//准备1D直方图的参数
histSize[0] =256;
hranges[0] = 0.0;
hranges[1] = 255.0;
channels[0] = 0;
//默认情况,我们考察0号通道
//计算1D直方图
MatND getHistogram(const Mat&image)
//计算直方图
calcHist(&image,
//计算单张图像的直方图
//通道的数量
//不使用图像作为掩码
//返回的直方图
//这是1D的直方图
//项的数量
//像素值的范围
//计算1D直方图,并返回一幅图像
Mat getHistogramImage(const Mat &image)
//首先计算直方图
MatND hist = getHistogram(image);
//获取最大值和最小值
double maxVal = 0;
double minVal = 0;
minMaxLoc(hist,&minVal,&maxVal,0,0);
//显示直方图的图像
Mat histImg(histSize[0],histSize[0],CV_8U,Scalar(255));
//设置最高点为nbins的90%
= static_cast&int&(0.9*histSize[0]);
//每个条目都绘制一条垂直线
for(int h = 0;h&histSize[0];h++){
float binVal =hist.at&float&(h);
int intensity = static_cast&int&(binVal*hpt/maxVal);
//两点之间绘制一条线
line(histImg,Point(h,histSize[0]),
Point(h,histSize[0]-intensity),
Scalar::all(0));
return histI
#endif // HISTOGRAM1D_H
main函数如下,直接调用getHistogramImage即可得到直方图:
#include &QCoreApplication&
#include &Histogram1D.h&
int main(int argc, char *argv[])
namedWindow( &src1&, WINDOW_AUTOSIZE );
namedWindow( &src2&, WINDOW_AUTOSIZE );
Mat image = imread( &test.jpg&,0 );
//读取灰度图
Histogram1D
imshow( &src1&, image);
imshow( &src2&, h.getHistogramImage(image));
waitKey(30);
if( 27==c )
效果如下:
原始灰度图像
当然我们还可以用calcHist函数来计算彩色BGR图像的直方图,这时候直方图变成三维的了:
#ifndef COLORHISTOGRAM_H
#define COLORHISTOGRAM_H
#include &opencv2/core/core.hpp&
#include &opencv2/highgui/highgui.hpp&
#include &opencv2/imgproc/imgproc.hpp&
#include&QDebug&
class ColorHistogram{
int histSize[3];
//项的数量
float hranges[2];
//像素的最小及最大值
const float* ranges[3];
int channels[3];
//用到三个通道
ColorHistogram(){
//准备彩色直方图的参数
histSize[0] = histSize[1]= histSize[2]=256;
hranges[0] = 0.0;
hranges[1] = 255.0;
ranges[0] =ranges[1]=ranges[2]=
//所有通道都有相同的范围
channels[0] = 0;
channels[1] = 1;
channels[2] = 2;
//计算三维直方图
MatND getHistogram(const Mat&image)
//计算直方图
calcHist(&image,
//计算单张图像的直方图
//通道的数量
//不使用图像作为掩码
//返回的直方图
//这是三维的直方图
//项的数量
//像素值的范围
qDebug()&&hist.
#endif // COLORHISTOGRAM_H
这时候getHistogram返回的是一个256*256*256的矩阵,包含了超过1600万个元素,这计算代价是非常大的,可以参考中所述的方法减少颜色的数量,或者可以使用cv::SparseMat数据结构,用于存储大型的稀疏矩阵,这样可以极大地减少内存的消耗。
PS:至于绘制三维直方图的绘制比较麻烦,以后有时间看看用qt实现个界面,感兴趣的话可以先参看下这篇文章
2. 查找表的使用
查找表实际上就是一个简单的一对一(或者多对一)的函数,定义了如何将像素&#20540;转换为新的&#20540;,本质上就是一个一维数组。
openCV中用cv::LUT的方法对图像应用查找表生成新图像,我们将这个功能加到Histogram1D类中:
//应用查找表,image为输入图像,lookup是1*256的unchar矩阵,代表查找表
Mat applyLookUp(const Mat&image,const Mat&lookup)
//应用查找表
LUT(image,lookup,result);
}这时我们可以做个简单的实验,比如将原先每个像素强度进行反转,即x变成255-x:
int dim(256);
Mat lut(1,&dim,CV_8U);
for(int i=0;i&256;i++)
lut.at&uchar&(i) = 255-i;
Mat reverse = h.applyLookUp(image,lut);
效果如下:
3. 直方图均衡化
直方图均衡化其实就是为了让直方图更加的平坦,能够大幅改善图像的外观。
openCV中提供了一个简单易用的函数cv::equalizeHist来执行直方图均衡化。
//直方图均衡化
equalize(const Mat &image)
equalizeHist(image,result);
应用与之前的图像,效果如下:
可以看出图像的对比度增强了,直方图也更加的平坦。
《openCV2计算机视觉编程手册》
(转载请注明作者和出处:Shawn-HT&&)
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
Output 1 :
==& 255...
Code1只是演示了单通道的情况,对于多通道的例子,请看 Code2 然后再看 Code3。
使用 Mat::at 函数
原型 template&typename _Tp& inline _Tp& Mat::at(…) //其中参数有多个,也就是说 at 函数有多个重载
返回值为 Mat 类型, Mat 有个索引的重载,也就是 [] 符号的重载,用这个重载可以定位多通道数据,具体示例可以看下面代码
下面的代码把红色通道值大于128的颜色的置为白色,左边为原图,右边为处理过后的图。
int main(){
Mat img = imread("lena.jpg");
imshow("Lena Original", img);
for (int row = 0; row & img. row++)
for (int col = 0; col & img. col++)
/* 注意 Mat::at 函数是个模板函数, 需要指明参数类型, 因为这张图是具有红蓝绿三通道的图,
所以它的参数类型可以传递一个 Vec3b, 这是一个存放 3 个 uchar 数据的 Vec(向量). 这里
提供了索引重载, [2]表示的是返回第三个通道, 在这里是 Red 通道, 第一个通道(Blue)用[0]返回 */
if(img.at&Vec3b&(row, col)[2] & 128)
img.at&Vec3b&(row, col) = Vec3b(255, 255, 255);
imshow("Lena Modified", img);
cvWaitKey();
return 0;} Output 2 :
这段代码用的是 Fn1 的方式,效果和 Code 2 等价:
int main(){
Mat img = imread("lena.jpg");
imshow("Lena Original", img);
for (int row = 0; row & img. row++)
for (int col = 0; col & img. col++)
//主要是这里的代码
if(*(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1() * 2) & 128)
//[row, col]像素的第 1 通道地址被 * 解析(blue通道)
*(img.data + img.step[0] * row + img.step[1] * col) = 255;
//[row, col]像素的第 2 通道地址被 * 解析(green通道), 关于elemSize1函数的更多描述请见 Fn1 里所列的博文链接
*(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1()) = 255;
//[row, col]像素的第 3 通道地址被 * 解析(red通道)
*(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1() * 2) = 255;
imshow("Lena Modified", img);
cvWaitKey();
return 0;} Output 3 = Output 2
使用 Mat 的一个模板子类 Mat_&typename _Tp& 的 ( ) 符号重载定位一个像素 Code 4 :
int main(){
Mat m(400, 400, CV_8UC3, Scalar(255, 255, 255));
// m2 是 Mat_&Vec3b& 类型的, 因为 m 中元素的类型是 CV_8UC3, 可以用 Vec3b 存储 3 个通道的值
// 注意 Mat_&CV_8UC3& 这种写法是错误的, 因为 CV_8UC3 只是一个宏定义
// #define CV_8UC3 CV_MAKETYPE(CV_8U, 3)
Mat_&Vec3b& m2 =
// for 循环画一个红色的实心圆
for (int y = 0; y & m. y++)
for (int x = 0; x & m. x++)
if (pow(double(x-200), 2) + pow(double(y-200), 2) - 10000.0 & 0.)
// Mat_ 模板类实现了对()的重载, 可以定位到一个像素
m2(x, y) = Vec3b(0, 0, 255);
imshow("Image", m);
cvWaitKey();
return 0;} Output 4 : [ 看上去怎么有点不爽]
使用 Mat::ptr 模板函数 Code 5 :
int main(){
Mat m(400, 400, CV_8UC3, Scalar(226, 46, 166));
imshow("Before", m);&
for (int row = 0; row & m. row++)
if (row % 5 == 0)
// data 是 uchar* 类型的, m.ptr&uchar&(row) 返回第 row 行数据的首地址
// 需要注意的是该行数据是按顺序存放的,也就是对于一个 3 通道的 Mat, 一个像素有
// 有 3 个通道值, [B,G,R][B,G,R][B,G,R]... 所以一行长度为:
// sizeof(uchar) * m.cols * m.channels() 个字节
uchar* data = m.ptr&uchar&(row);
for (int col = 0; col & m. col++)
data[col * 3] = 102; //第row行的第col个像素点的第一个通道值 Blue
data[col * 3 + 1] = 217; // Green
data[col * 3 + 2] = 239; // Red
imshow("After", m);&
cout && (int)m.at&Vec3b&(0, 0)[0] && ','; //利用 Fn 1 介绍的方法输出一下像素值到控制台
cout && (int)m.at&Vec3b&(0, 0)[1] && ',';
cout && (int)m.at&Vec3b&(0, 0)[2] &&&
cvWaitKey();
return 0;} Output 5 :
Author : Ggicci 谢谢阅读,有误希望指正! --OpenCV初学者
阅读(20613)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'OpenCV获取与设置像素点的值的几个方法',
blogAbstract:'Title:
OpenCV像素值的获取与设置
使用 Mat 中对矩阵元素的地址定位的知识 (参考博文:'
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 opencv获取网络摄像头 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信