关于opencv更改摄像头参数(帧率,分辨率,曝光度……)的几个问题

2023-10-27

1,适用于VideoCapture打开的摄像头

VideoCapture capture(0); 设置摄像头参数 不要随意修改

capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080);//宽度

capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960);//高度

capture.set(CV_CAP_PROP_FPS, 30);//帧率 帧/秒

capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度 

capture.set(CV_CAP_PROP_CONTRAST,40);//对比度 40

capture.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50

capture.set(CV_CAP_PROP_HUE, 50);//色调 50

capture.set(CV_CAP_PROP_EXPOSURE, 50);//曝光 50 获取摄像头参数

得到摄像头的参数

capture.get(CV_CAP_PROP_FRAME_WIDTH);

capture.get(CV_CAP_PROP_FRAME_HEIGHT);

capture.get(CV_CAP_PROP_FPS);

capture.get(CV_CAP_PROP_BRIGHTNESS);

capture.get(CV_CAP_PROP_CONTRAST);

capture.get(CV_CAP_PROP_SATURATION);

capture.get(CV_CAP_PROP_HUE);

capture.get(CV_CAP_PROP_EXPOSURE); 获取视频参数:

capture.get(CV_CAP_PROP_FRAME_COUNT);//视频帧数 

然后你会发现除了个别参数你能更改之外(如曝光度),大分布你是不能更改的,甚至都没办法得到,这种并不适用

2,不做开发,只是单纯的更改

那么推荐一个软件,amcap,百度网盘链接,百度网盘-链接不存在,很简单很容易上手。

补,现在突然想起来我的一个学长告诉我的,利用这个软件调节摄像头的曝光度,可以改变帧率,且摄像头会记住曝光度的设置(其他特性就没有这个特点)。-2019.3.12

3,修改opencv的文件,不过效果可能和第一个差不多

大概是在opencv的这个位置,找一下,modules/highgui/src/cap_v4l.cpp,里面有关于参数的设置,位置比较靠前,可以搜索,也可以直接找到

大致在200多行

4,v4l2

下面是我找到的一篇参考,可以突破帧率的限制,当然前提是摄像头支持

Jetson TX1开发笔记(六):V4L2+OpenCV3.1以MJPG格式读取USB摄像头图像并实时显示_Jack-Cui的博客-CSDN博客

目前只适用于Linux系统,本人试验过,120帧的摄像头在只打开摄像头时可以达到100帧左右,设置的图片分辨率越小,能达到的帧率越高

 
  1. #include <unistd.h>

  2. #include <error.h>

  3. #include <errno.h>

  4. #include <fcntl.h>

  5. #include <sys/ioctl.h>

  6. #include <sys/types.h>

  7. #include <pthread.h>

  8. #include <linux/videodev2.h>

  9. #include <sys/mman.h>

  10. #include <opencv2/core/core.hpp>

  11. #include <opencv2/highgui/highgui.hpp>

  12. #include <stdio.h>

  13. #include <stdlib.h>

  14. #include <string.h>

  15. #include <time.h>

  16. #include "opencv2/highgui/highgui.hpp"

  17. #include "opencv2/imgproc/imgproc.hpp"

  18. #include <math.h>

  19. #include <iostream>

  20. #include <iomanip>

  21. #include <string>

  22. using namespace std;

  23. using namespace cv;

  24. #define CLEAR(x) memset(&(x), 0, sizeof(x))

  25. #define IMAGEWIDTH 3264

  26. #define IMAGEHEIGHT 2448

  27. #define WINDOW_NAME1 "【原始图】" //为窗口标题定义的宏

  28. #define WINDOW_NAME2 "【图像轮廓】" //为窗口标题定义的宏

  29. Mat g_srcImage; Mat g_grayImage;

  30. int g_nThresh = 90;

  31. int g_nMaxThresh = 255;

  32. RNG g_rng(12345);

  33. Mat g_cannyMat_output;

  34. vector<vector<Point> > g_vContours;

  35. vector<Vec4i> g_vHierarchy;

  36. Point point1[100000];

  37. Point point2[100000];

  38. Point point3[100000];

  39. int ii,iii;

  40. int flag2 = 0;//避障用

  41. float number = 0;

  42. int fps=0;

  43. class V4L2Capture {

  44. public:

  45. V4L2Capture(char *devName, int width, int height);

  46. virtual ~V4L2Capture();

  47. int openDevice();

  48. int closeDevice();

  49. int initDevice();

  50. int startCapture();

  51. int stopCapture();

  52. int freeBuffers();

  53. int getFrame(void **,size_t *);

  54. int backFrame();

  55. static void test();

  56. private:

  57. int initBuffers();

  58. struct cam_buffer

  59. {

  60. void* start;

  61. unsigned int length;

  62. };

  63. char *devName;

  64. int capW;

  65. int capH;

  66. int fd_cam;

  67. cam_buffer *buffers;

  68. unsigned int n_buffers;

  69. int frameIndex;

  70. };

  71. V4L2Capture::V4L2Capture(char *devName, int width, int height) {

  72. // TODO Auto-generated constructor stub

  73. this->devName = devName;

  74. this->fd_cam = -1;

  75. this->buffers = NULL;

  76. this->n_buffers = 0;

  77. this->frameIndex = -1;

  78. this->capW=width;

  79. this->capH=height;

  80. }

  81. V4L2Capture::~V4L2Capture() {

  82. // TODO Auto-generated destructor stub

  83. }

  84. int V4L2Capture::openDevice() {

  85. /*设备的打开*/

  86. printf("video dev : %s\n", devName);

  87. fd_cam = open(devName, O_RDWR);

  88. if (fd_cam < 0) {

  89. perror("Can't open video device");

  90. }

  91. return 0;

  92. }

  93. int V4L2Capture::closeDevice() {

  94. if (fd_cam > 0) {

  95. int ret = 0;

  96. if ((ret = close(fd_cam)) < 0) {

  97. perror("Can't close video device");

  98. }

  99. return 0;

  100. } else {

  101. return -1;

  102. }

  103. }

  104. int V4L2Capture::initDevice() {

  105. int ret;

  106. struct v4l2_capability cam_cap; //显示设备信息

  107. struct v4l2_cropcap cam_cropcap; //设置摄像头的捕捉能力

  108. struct v4l2_fmtdesc cam_fmtdesc; //查询所有支持的格式:VIDIOC_ENUM_FMT

  109. struct v4l2_crop cam_crop; //图像的缩放

  110. struct v4l2_format cam_format; //设置摄像头的视频制式、帧格式等

  111. /* 使用IOCTL命令VIDIOC_QUERYCAP,获取摄像头的基本信息*/

  112. ret = ioctl(fd_cam, VIDIOC_QUERYCAP, &cam_cap);

  113. if (ret < 0) {

  114. perror("Can't get device information: VIDIOCGCAP");

  115. }

  116. printf(

  117. "Driver Name:%s\nCard Name:%s\nBus info:%s\nDriver Version:%u.%u.%u\n",

  118. cam_cap.driver, cam_cap.card, cam_cap.bus_info,

  119. (cam_cap.version >> 16) & 0XFF, (cam_cap.version >> 8) & 0XFF,

  120. cam_cap.version & 0XFF);

  121. /* 使用IOCTL命令VIDIOC_ENUM_FMT,获取摄像头所有支持的格式*/

  122. cam_fmtdesc.index = 0;

  123. cam_fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  124. printf("Support format:\n");

  125. while (ioctl(fd_cam, VIDIOC_ENUM_FMT, &cam_fmtdesc) != -1) {

  126. printf("\t%d.%s\n", cam_fmtdesc.index + 1, cam_fmtdesc.description);

  127. cam_fmtdesc.index++;

  128. }

  129. /* 使用IOCTL命令VIDIOC_CROPCAP,获取摄像头的捕捉能力*/

  130. cam_cropcap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  131. if (0 == ioctl(fd_cam, VIDIOC_CROPCAP, &cam_cropcap)) {

  132. printf("Default rec:\n\tleft:%d\n\ttop:%d\n\twidth:%d\n\theight:%d\n",

  133. cam_cropcap.defrect.left, cam_cropcap.defrect.top,

  134. cam_cropcap.defrect.width, cam_cropcap.defrect.height);

  135. /* 使用IOCTL命令VIDIOC_S_CROP,获取摄像头的窗口取景参数*/

  136. cam_crop.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  137. cam_crop.c = cam_cropcap.defrect; //默认取景窗口大小

  138. if (-1 == ioctl(fd_cam, VIDIOC_S_CROP, &cam_crop)) {

  139. //printf("Can't set crop para\n");

  140. }

  141. } else {

  142. printf("Can't set cropcap para\n");

  143. }

  144. /* 使用IOCTL命令VIDIOC_S_FMT,设置摄像头帧信息*/

  145. cam_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  146. cam_format.fmt.pix.width = capW;

  147. cam_format.fmt.pix.height = capH;

  148. cam_format.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG; //要和摄像头支持的类型对应

  149. cam_format.fmt.pix.field = V4L2_FIELD_INTERLACED;

  150. ret = ioctl(fd_cam, VIDIOC_S_FMT, &cam_format);

  151. if (ret < 0) {

  152. perror("Can't set frame information");

  153. }

  154. /* 使用IOCTL命令VIDIOC_G_FMT,获取摄像头帧信息*/

  155. cam_format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  156. ret = ioctl(fd_cam, VIDIOC_G_FMT, &cam_format);

  157. if (ret < 0) {

  158. perror("Can't get frame information");

  159. }

  160. printf("Current data format information:\n\twidth:%d\n\theight:%d\n",

  161. cam_format.fmt.pix.width, cam_format.fmt.pix.height);

  162. ret = initBuffers();

  163. if (ret < 0) {

  164. perror("Buffers init error");

  165. //exit(-1);

  166. }

  167. return 0;

  168. }

  169. int V4L2Capture::initBuffers() {

  170. int ret;

  171. /* 使用IOCTL命令VIDIOC_REQBUFS,申请帧缓冲*/

  172. struct v4l2_requestbuffers req;

  173. CLEAR(req);

  174. req.count = 4;

  175. req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  176. req.memory = V4L2_MEMORY_MMAP;

  177. ret = ioctl(fd_cam, VIDIOC_REQBUFS, &req);

  178. if (ret < 0) {

  179. perror("Request frame buffers failed");

  180. }

  181. if (req.count < 2) {

  182. perror("Request frame buffers while insufficient buffer memory");

  183. }

  184. buffers = (struct cam_buffer*) calloc(req.count, sizeof(*buffers));

  185. if (!buffers) {

  186. perror("Out of memory");

  187. }

  188. for (n_buffers = 0; n_buffers < req.count; n_buffers++) {

  189. struct v4l2_buffer buf;

  190. CLEAR(buf);

  191. // 查询序号为n_buffers 的缓冲区,得到其起始物理地址和大小

  192. buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  193. buf.memory = V4L2_MEMORY_MMAP;

  194. buf.index = n_buffers;

  195. ret = ioctl(fd_cam, VIDIOC_QUERYBUF, &buf);

  196. if (ret < 0) {

  197. printf("VIDIOC_QUERYBUF %d failed\n", n_buffers);

  198. return -1;

  199. }

  200. buffers[n_buffers].length = buf.length;

  201. //printf("buf.length= %d\n",buf.length);

  202. // 映射内存

  203. buffers[n_buffers].start = mmap(

  204. NULL, // start anywhere

  205. buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd_cam,

  206. buf.m.offset);

  207. if (MAP_FAILED == buffers[n_buffers].start) {

  208. printf("mmap buffer%d failed\n", n_buffers);

  209. return -1;

  210. }

  211. }

  212. return 0;

  213. }

  214. int V4L2Capture::startCapture() {

  215. unsigned int i;

  216. for (i = 0; i < n_buffers; i++) {

  217. struct v4l2_buffer buf;

  218. CLEAR(buf);

  219. buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  220. buf.memory = V4L2_MEMORY_MMAP;

  221. buf.index = i;

  222. if (-1 == ioctl(fd_cam, VIDIOC_QBUF, &buf)) {

  223. printf("VIDIOC_QBUF buffer%d failed\n", i);

  224. return -1;

  225. }

  226. }

  227. enum v4l2_buf_type type;

  228. type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  229. if (-1 == ioctl(fd_cam, VIDIOC_STREAMON, &type)) {

  230. printf("VIDIOC_STREAMON error");

  231. return -1;

  232. }

  233. return 0;

  234. }

  235. int V4L2Capture::stopCapture() {

  236. enum v4l2_buf_type type;

  237. type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  238. if (-1 == ioctl(fd_cam, VIDIOC_STREAMOFF, &type)) {

  239. printf("VIDIOC_STREAMOFF error\n");

  240. return -1;

  241. }

  242. return 0;

  243. }/*ok*/

  244. int V4L2Capture::freeBuffers() {

  245. unsigned int i;

  246. for (i = 0; i < n_buffers; ++i) {

  247. if (-1 == munmap(buffers[i].start, buffers[i].length)) {

  248. printf("munmap buffer%d failed\n", i);

  249. return -1;

  250. }

  251. }

  252. free(buffers);

  253. return 0;

  254. }

  255. int V4L2Capture::getFrame(void **frame_buf, size_t* len) {

  256. struct v4l2_buffer queue_buf;

  257. CLEAR(queue_buf);

  258. queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  259. queue_buf.memory = V4L2_MEMORY_MMAP;

  260. if (-1 == ioctl(fd_cam, VIDIOC_DQBUF, &queue_buf)) {

  261. printf("VIDIOC_DQBUF error\n");

  262. return -1;

  263. }

  264. *frame_buf = buffers[queue_buf.index].start;

  265. *len = buffers[queue_buf.index].length;

  266. frameIndex = queue_buf.index;

  267. return 0;

  268. }

  269. int V4L2Capture::backFrame() {

  270. if (frameIndex != -1) {

  271. struct v4l2_buffer queue_buf;

  272. CLEAR(queue_buf);

  273. queue_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;

  274. queue_buf.memory = V4L2_MEMORY_MMAP;

  275. queue_buf.index = frameIndex;

  276. if (-1 == ioctl(fd_cam, VIDIOC_QBUF, &queue_buf)) {

  277. printf("VIDIOC_QBUF error\n");

  278. return -1;

  279. }

  280. return 0;

  281. }

  282. return -1;

  283. }

  284. void V4L2Capture::test() {

  285. unsigned char *yuv422frame = NULL;

  286. unsigned long yuvframeSize = 0;

  287. string videoDev="/dev/video0";

  288. V4L2Capture *vcap = new V4L2Capture(const_cast<char*>(videoDev.c_str()),

  289. 1920, 1080);

  290. vcap->openDevice();

  291. vcap->initDevice();

  292. vcap->startCapture();

  293. vcap->getFrame((void **) &yuv422frame, (size_t *)&yuvframeSize);

  294. vcap->backFrame();

  295. vcap->freeBuffers();

  296. vcap->closeDevice();

  297. }

  298. void line2(Point point3[100000], int n)

  299. {

  300. float aa, bb, cc, dd, ee, ff, gg;

  301. int jj = 0;

  302. for (;jj <n;jj++)

  303. {

  304. aa += point3[jj].x*point3[jj].x;

  305. bb += point3[jj].x;

  306. cc += point3[jj].x*point3[jj].y;

  307. dd += point3[jj].y;

  308. }

  309. ee = aa*n - bb*bb;

  310. if ((int)(ee* 100) != 0)

  311. {

  312. ff = (n*cc - bb*dd) / ee;

  313. gg = (dd - bb*ff) / n;

  314. }

  315. else {

  316. ff = 0;

  317. gg = 1;

  318. }

  319. Point point0, pointn;

  320. point0.y = 0;

  321. point0.x = gg;

  322. pointn.y = (n-1);

  323. pointn.x = ((n-1) * ff + gg);

  324. Mat draw_ing2 = Mat::zeros(g_cannyMat_output.size(), CV_8UC3);

  325. line(draw_ing2, point0, pointn, (255, 255, 255));

  326. imshow("10", draw_ing2);

  327. //cout << "\n"<<ff <<" "<< gg << endl;

  328. float the =180*atan(ff)/3.14159;

  329. float dis = ff * 160+gg - 160;

  330. cout << the << " " << dis << endl;

  331. //正中心ff=0,gg=160,逆时ff为正,顺时ff为负

  332. }

  333. void findcolor(cv::Mat &image)

  334. {

  335. cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();

  336. cv::Mat_<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>();

  337. ii = 0;

  338. iii = 0;

  339. int flagg = 0;

  340. cv::Mat srcX(image.rows, image.cols , CV_32F);

  341. cv::Mat srcY(image.rows, image.cols, CV_32F);

  342. for (int i = 0;i < image.rows;i++)

  343. {

  344. for (int j = 0;j < image.cols;j++)

  345. {

  346. if (flagg == 0)/*这样遍历水平方向无法得到有效数据*/

  347. {

  348. if ((*it)[0] == 255 && (*it)[1] == 0 && (*it)[2] == 255)

  349. {

  350. flagg = 1;

  351. point1[ii].x = i;

  352. point1[ii].y = j;

  353. ii++;

  354. }

  355. }

  356. else

  357. {

  358. if ((*it)[0] == 255 && (*it)[1] == 0 && (*it)[2] == 255)

  359. {

  360. flagg = 0;

  361. point2[iii].x = i;

  362. point2[iii].y = j;

  363. iii++;

  364. }

  365. }

  366. if (it == itend)

  367. break;

  368. else it++;

  369. }

  370. }

  371. IplImage pImg = IplImage(image);

  372. CvArr* arr = (CvArr*)&pImg;

  373. int nn = ii;

  374. for (;ii > 0;ii--)

  375. {

  376. point3[ii].x = (point1[ii].x + point2[ii].x) / 2;

  377. point3[ii].y = (point1[ii].y + point2[ii].y) / 2;

  378. //circle(image, point3[ii], 1, (255, 255, 255));

  379. cvSet2D(arr, point3[ii].x, point3[ii].y, Scalar(255, 255, 255));

  380. }

  381. line2(point3, nn);

  382. }

  383. void on_ThreshChange(int, void* )

  384. {

  385. // 使用Canndy检测边缘

  386. Canny( g_grayImage, g_cannyMat_output, g_nThresh, g_nThresh*2, 3 );

  387. // 找到轮廓

  388. findContours( g_cannyMat_output, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );

  389. // 计算矩

  390. vector<Moments> mu(g_vContours.size() );

  391. for(unsigned int i = 0; i < g_vContours.size(); i++ )

  392. { mu[i] = moments( g_vContours[i], false ); }

  393. // 计算中心矩

  394. vector<Point2f> mc( g_vContours.size() );

  395. for( unsigned int i = 0; i < g_vContours.size(); i++ )

  396. { mc[i] = Point2f( static_cast<float>(mu[i].m10/mu[i].m00), static_cast<float>(mu[i].m01/mu[i].m00 )); }

  397. // 绘制轮廓

  398. Mat drawing = Mat::zeros(g_cannyMat_output.size(), CV_8UC3);

  399. for( unsigned int i = 0; i< g_vContours.size(); i++ )

  400. {

  401. //Scalar color = Scalar( g_rng.uniform(0, 255), g_rng.uniform(0,255), g_rng.uniform(0,255) );//随机生成颜色值

  402. Scalar color = Scalar(255, 0, 255);

  403. drawContours( drawing, g_vContours, i, color, 2, 8, g_vHierarchy, 0, Point() );//绘制外层和内层轮廓

  404. circle( drawing, mc[i], 4, color, -1, 8, 0 );;//绘制圆

  405. }

  406. findcolor(drawing);

  407. //line1(point1,point2,ii,iii);

  408. // 显示到窗口中

  409. // namedWindow( WINDOW_NAME2, WINDOW_AUTOSIZE );

  410. imshow( WINDOW_NAME2, drawing );

  411. }

  412. void findline(Mat image)

  413. {

  414. cv::Mat_<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();

  415. cv::Mat_<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>();

  416. for (;it != itend;it++)

  417. {

  418. if ((*it)[1] == 0 && (*it)[2] >= 100)//条件可能需要改变

  419. {

  420. if(flag2==0)

  421. {

  422. flag2 = 1;

  423. cout << "注意line1,避障"<<endl;

  424. //向主控发送消息

  425. }

  426. else

  427. {

  428. cout << "注意line2,避障" << endl;

  429. //向主控发送消息

  430. //避障一与避障二中间要隔一段时间

  431. }

  432. }

  433. }

  434. }

  435. void wave(const cv::Mat &image, cv::Mat &result)

  436. {

  437. cv::Mat srcX(image.rows / 2, image.cols / 2, CV_32F);

  438. cv::Mat srcY(image.rows / 2, image.cols / 2, CV_32F);

  439. for (int i = 0;i<image.rows /2;i++)

  440. for (int j = 0;j < image.cols /2;j++)

  441. {

  442. srcX.at<float>(i, j) = 2 * j;

  443. srcY.at<float>(i, j) = 2 * i;

  444. }

  445. cv::remap(image, result, srcX, srcY, cv::INTER_LINEAR);

  446. }

  447. void VideoPlayer() {

  448. unsigned char *yuv422frame = NULL;

  449. unsigned long yuvframeSize = 0;

  450. string videoDev = "/dev/video0";

  451. V4L2Capture *vcap = new V4L2Capture(const_cast<char*>(videoDev.c_str()), 640, 480);

  452. vcap->openDevice();

  453. vcap->initDevice();

  454. vcap->startCapture();

  455. cvNamedWindow("Capture",CV_WINDOW_AUTOSIZE);

  456. IplImage* img;

  457. CvMat cvmat;

  458. double t;

  459. clock_t start, end;

  460. double number=0;

  461. int fps=0;

  462. while(1){

  463. start=clock();

  464. t = (double)cvGetTickCount();

  465. vcap->getFrame((void **) &yuv422frame, (size_t *)&yuvframeSize);

  466. cvmat = cvMat(IMAGEHEIGHT,IMAGEWIDTH,CV_8UC3,(void*)yuv422frame); //CV_8UC3

  467. //解码

  468. img = cvDecodeImage(&cvmat,1);

  469. if(!img){

  470. printf("DecodeImage error!\n");

  471. }

  472. cv::Mat g_srcImage = cv::cvarrToMat(img,true);

  473. cvShowImage("Capture",img);

  474. cvReleaseImage(&img);

  475. vcap->backFrame();

  476. if((cvWaitKey(1)&255) == 27){

  477. exit(0);

  478. }

  479. wave(g_srcImage, g_srcImage);

  480. findline(g_srcImage);

  481. // 把原图像转化成灰度图像并进行平滑

  482. cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);

  483. blur(g_grayImage, g_grayImage, Size(3, 3));

  484. //创建滚动条并进行初始化

  485. createTrackbar(" 阈值", WINDOW_NAME1, &g_nThresh, g_nMaxThresh, on_ThreshChange);

  486. on_ThreshChange(0, 0);

  487. t = (double)cvGetTickCount() - t;

  488. printf("Used time is %g ms\n", (t / (cvGetTickFrequency() * 1000)));

  489. end =clock();

  490. number=number+end-start;

  491. fps++;

  492. if (number/ CLOCKS_PER_SEC>= 0.25)//windows10 for CLK_TCK

  493. {

  494. cout<<fps<<endl;

  495. fps = 0;

  496. number = 0;

  497. }

  498. }

  499. vcap->stopCapture();

  500. vcap->freeBuffers();

  501. vcap->closeDevice();

  502. }

  503. int main() {

  504. VideoPlayer();

  505. return 0;

  506. }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于opencv更改摄像头参数(帧率,分辨率,曝光度……)的几个问题 的相关文章

  • 创建 OpenCV 的 mouseCallback 函数的基于类的实现时遇到问题

    正如标题所示 我在基于类的 C 结构中实现 OpenCV 的 mouseCallback 函数时遇到了一些麻烦 请允许我解释一下 我定义了一个名为 BriskMatching 的类 在其中创建了一个名为 mouseCallback 的成员函
  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • iOS 上的 OpenCV - VideoCapture 属性始终返回 1

    我一直在尝试构建一个简单的 OpenCV iOS 应用程序 该应用程序从捆绑包中加载视频并查询其帧数 持续时间等 然后它将尝试从中获取各个帧 不幸的是 当我使用VideoCapture类中 所有属性返回值 1 然后我尝试导航到frame 1
  • Opencv Mat内存管理

    内存管理对于图像类至关重要 在opencv中 图像类是cv Mat 它有一个微妙的内存管理方案 假设我已经有了自己的图像类SelfImage class SelfImage public int width int height unsig
  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • “没有名为‘cv2’的模块”,但已安装

    我已经安装了包含 opencv 贡献的 whl 文件 因为我想使用 SIFT 算法 我在 conda 环境中使用 pip 安装了它 所以当我在 conda list 中提示时 它会向我显示 opencv python 3 4 5 contr
  • 图像梯度角计算

    我实际上是按照论文的说明进行操作的 输入应该是二进制 边缘 图像 输出应该是一个新图像 并根据论文中的说明进行了修改 我对指令的理解是 获取边缘图像的梯度图像并对其进行修改 并使用修改后的梯度创建一个新图像 因此 在 MATLAB Open
  • Python:Urllib2 和 OpenCV

    我有一个程序 可以将图像保存在本地目录中 然后从该目录中读取图像 但我不想保存图像 我想直接从url读取它 这是我的代码 import cv2 cv as cv import urllib2 url http cache2 allposte
  • 如何将多行文本插入到框架/图像中

    我使用 C 和 OpenCV 创建了一个框架 并想在其中插入几行文本 使用以下代码 putText frame My text here cvPoint 30 30 FONT HERSHEY COMPLEX SMALL 0 8 cvScal
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 如何使用 AdaBoost 进行特征选择?

    我想使用 AdaBoost 从大量 100k 中选择一组好的特征 AdaBoost 的工作原理是迭代功能集并根据功能的执行情况添加功能 它选择对现有特征集错误分类的样本表现良好的特征 我目前正在 Open CV 中使用CvBoost 我得到
  • 未加载库:@rpath/libopenblasp-r0.2.19.dylib

    我应该如何解决这个问题 Monas MacBook Pro 02 02 mona python Python 3 6 1 Anaconda custom x86 64 default May 11 2017 13 04 09 GCC 4 2
  • 相机校准:如何正确进行

    我正在尝试使用棋盘格通过众所周知的张氏方法进行校准 然后进行捆绑调整 该方法在 Matlab 和 OpenCV 中都可用 有很多经验指南 但从我个人的经验来看 准确性是相当随机的 它有时可能非常好 但有时也可能非常糟糕 实际上 只需将棋盘放
  • 如何用OpenCV解决图像处理相机IO延迟

    我有一个 OpenCV 程序 其工作原理如下 VideoCapture cap 0 Mat frame while true cap gt gt frame myprocess frame 问题是如果myprocess耗时较长 超过相机的I
  • 针对不同处理器架构的 Gradle android 构建

    我想使用 Gradle 为 4 个不同的 Android CPU 处理器架构 armeabi armeabi v7a x86 mips 构建 4 个单独的 apk 我有为 4 个 CPU 架构构建的本机 OpenCV 库libs folde
  • OpenCV Sobel 滤波器 - 为什么它看起来这么糟糕,尤其是与 Gimp 相比?

    我正在尝试使用 OpenCV 重建一些我之前在 Gimp 中完成的预处理 第一级是用于边缘检测的 Sobel 滤波器 它在 Gimp 中运行得很好 现在这是我对 OpenCV 的尝试 opencv imgproc Sobel src sca

随机推荐

  • Html+css(第一天)

    基础认识 1 五大浏览器有哪些 IE浏览器 火狐浏览器 Firefox 谷歌浏览器 Chrome Safari浏览器 欧朋浏览器 Opera 2 相同的网页在不同浏览器中显示效果会完全一致吗 因为不同浏览器渲染引擎不同 解析的效果会存在差异
  • 编程思想:面向对象和面向过程

    何谓面向对象 何谓面向过程 对于这编程界的两大思想 一直贯穿在我们学习和工作当中 我们知道面向过程和面向对象 但要让我们讲出来个所以然 又感觉是不知从何说起 最后可能也只会说出一句就是那样啦 你知道啦 而这种茫然 其实就是对这两大编程思想的
  • linux系统在当前目录下创建子目录,linux根目录下一级子目录

    linux上每一个文件都必须是在根文件系统下的某个路径或者是从根文件系统才可以访问 文件系统中只分为目录和文件 所有文件都是存放在目录下 root根目录用 表示 ls 查看根目录下的一级子目录 boot 存放系统启动相关的文件 如内核文件
  • 地址解析中文乱码

    function Params var pattern w a zA Z0 9 u4e00 u9fa5 ig params 定义正则表达式和一个空对象 decodeURIComponent window location href true
  • 【数据结构】包装类&简单认识泛型

    文章目录 1 包装类 1 1 基本数据类型和对应的包装类 1 2 装箱和拆箱 2 什么是泛型 3 引出泛型 3 1 语法 4 泛型类的使用 4 1 语法 4 2 示例 4 3 类型推导 Type Inference 5 泛型的上界 5 1
  • E9流程表单中动态自定义添加button js代码

  • 发现一款专为.NET WinForms开发的数据可视化图表库

    FastReport是快捷 轻量级报表工具 使用简单 功能丰富 性价比高 适合个人 中小型企业和项目使用 FastReport近期推出了全新专为 NET WinForms开发的数据可视化图表库FastReport Business Grap
  • echarts水波球特效(附带外边框进度条)

    echarts水波球特效 附带外边框进度条 1 话不多说先上效果图 2 这里用到了echarts的liquidFill图表 需要加载liquidFill插件 npm i echarts liquidFill save 3 在main js入
  • c++ vector容器函数说明

    构造函数 vector 默认构造函数 创建一个空的 vector 对象 vector size type n 创建一个包含 n 个元素的 vector 对象 每个元素的值都是类型的默认值 vector size type n const v
  • yii2-admin扩展自定义目录

    yii2 admin文件如下 仓库地址 https github com mdmsoft yii2 admin tree master 复制yii2 admin文件至自定义目录 比如我就复制到了common rbac目录 在配置文件comm
  • 如何动态调试Python的第三方库

    注意 本文方法仅限于调试安装时附带py源码的库 如sklearn 引入 用sklearn中的sklearn feature extraction text TfidfTransformer来获取TF特征 但发现sklearn的计算结果与我手
  • 使用变量时,单引号、双引号、反向单引号的区别

    单引号 双引号 反向单引号的区别 1 单引号 当变量内容用单引号 时 对里面的命令echo和变量USER都无法识别 只识别成字符串本身 称之为强引用 2 双引号 当变量内容用双引号 时 是不能识别出里面的命令echo的 但可识别出里面的变量
  • 码农干货系列【1】--方向包围盒(OBB)碰撞检测

    码农干货系列 1 方向包围盒 OBB 碰撞检测 2012 06 07 11 40 by 当耐特 9251 阅读 20 评论 收藏 编辑 干货 最近一直在删文章 不是要关博洗手什么的 而是被删的文章没有达到 干货 的标准 干货的反义词是水货
  • tensorflow命令行参数之boolean使用的说明(踩坑指南)

    问题描述 简而言之就是 参数输出值与命令行输入值不一致 比如我们有个main py 具体代码如下 import tensorflow as tf tf app flags DEFINE boolean if gpu True if use
  • HTML网页链接

    1 链接的基本认识 所谓链接 是指一个页面之向一个目标的链接关系 链接地址不仅仅是一个页面地址 也可能是一个文件地址或者邮箱地址 文本链接 图像链接 邮箱地址的写法 a href 2 同一页面中快速查找消息 通过设置a标签中src内容的 来
  • Flutter Timer 定时器

    Flutter Timer 定时器 引包 Timer 类存在于dart async内 所以我们需要先导入 import dart async 使用场景 1 回调只需要一次 2 回调多次 例 回调一次 Duration timeout Dur
  • 玩转Matplotlib绘制柱形图

    使用Python Matplotlib模块中的bar 函数绘制柱形图 可视化直观地对比数据 代码如下 import pandas as pd import numpy as np import matplotlib pyplot as pl
  • **开启我的51单片机学习之路,基于51单片机数码管显示电子时钟**

    1 此款电子时钟 时间可以设置 有4个按键 一个功能按键 一个加 一个减 一个确定按键 2 按下功能按键一下 时钟走时停止 时两位数码管闪烁 代表此时再调时状态 这个时候加减按键就可以调整时钟 再次按下功能按键 就可以调整分钟 再按一下功能
  • Linux 音视频开发杂记之三-wayland环境搭建

    一 环境安装与运行测试程序 安装测试程序 Weston是Wayland提供的示例程序 sudo apt install weston 运行Weston 如果设置了 DISPLAY 那么Weston将在一个窗口中的X下运行 并从X中获取输入
  • 关于opencv更改摄像头参数(帧率,分辨率,曝光度……)的几个问题

    1 适用于VideoCapture打开的摄像头 VideoCapture capture 0 设置摄像头参数 不要随意修改 capture set CV CAP PROP FRAME WIDTH 1080 宽度 capture set CV