summaryrefslogtreecommitdiffstats
path: root/app/camera.cpp
diff options
context:
space:
mode:
authorzheng_wenlong <wenlong_zheng@nexty-ele.com>2019-04-09 10:38:35 +0900
committerzheng_wenlong <wenlong_zheng@nexty-ele.com>2019-04-10 10:02:52 +0900
commit2b54cb6f5797df36d14df55cd685a0d61ccd7001 (patch)
treeb1b816b03f29cbf4675da5d3812eff8682238c4c /app/camera.cpp
Add demo3 tachometer source code for cluster mode. [Patch Set 2] Update LICENSE file. Change-Id: Icac1ec8a08056988b519982d77d15a1eb5da8169 BUG-AGL: SPEC-2261 Signed-off-by: zheng_wenlong <wenlong_zheng@nexty-ele.com>
Diffstat (limited to 'app/camera.cpp')
-rw-r--r--app/camera.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/app/camera.cpp b/app/camera.cpp
new file mode 100644
index 0000000..f935f22
--- /dev/null
+++ b/app/camera.cpp
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "camera.h"
+#include <QPainter>
+#include <opencv2/imgproc.hpp>
+
+#include <linux/videodev2.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+using namespace cv;
+
+Camera::Camera() {
+ running = false;
+ timer = new QTimer(this);
+ capture = new VideoCapture();
+
+ connect(timer, SIGNAL(timeout()), this, SLOT(grab()));
+}
+
+Camera::~Camera() {
+ if (timer->isActive())
+ timer->stop();
+ if (capture && capture->isOpened())
+ capture->release();
+ delete timer;
+ delete capture;
+}
+
+void Camera::paint(QPainter *painter) {
+ painter->drawImage(0, 0, image);
+}
+
+void Camera::enumerateCameras() {
+ int maxID = 20;
+ for (int idx = 2; idx <maxID; idx++){
+ std::stringstream no;
+ no << "/dev/video" << idx;
+ qDebug() << idx;
+ int fd = open(no.str().c_str(), O_RDWR);
+ if (fd != -1){
+ struct v4l2_capability cap;
+
+ if (ioctl(fd,VIDIOC_QUERYCAP,&cap) != -1){
+ if ((cap.capabilities & (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING)) == (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING)){
+ qDebug()<< (char*)(cap.driver) << ">" << (char*)(cap.card) << ">" << (char*)(cap.bus_info);// << (cap.version>>16)&0xFF << (cap.version>>8)&0XFF << cap.version&0xFF;
+ cam_arr.push_back(idx); // vector of all available cameras
+ }
+ }
+ close(fd);
+ }
+ }
+
+ camcnt = cam_arr.length();
+}
+
+void Camera::start(int no, int fps, QString res) {
+ int retryCount = 0;
+ while(!capture->open(no)){
+ if(retryCount++==5){
+ qDebug()<< "Try to open camera for 5 times failed, give up.";
+ return;
+ }else{
+ qDebug()<< "open camera failed, retry " << retryCount;
+ usleep(200000);
+ }
+ }
+
+ capture->set(CAP_PROP_FRAME_WIDTH, res.section("*", 0, 0).toInt());
+ capture->set(CAP_PROP_FRAME_HEIGHT, res.section("*", 1, 1).toInt());
+
+ if (fps > 0){
+ timer->start(1000/fps);
+ running = true;
+ emit isrunningChanged(running);
+ }
+}
+
+void Camera::stop() {
+ if (timer->isActive())
+ timer->stop();
+ if (capture->isOpened()){
+ qDebug()<< "release camera.";
+ capture->release();
+ }
+ image = QImage();
+ update();
+ running = false;
+ emit isrunningChanged(running);
+}
+
+QVariantList Camera::camranum() const{
+ return cam_arr;
+}
+
+int Camera::cameraCnt() {
+ return camcnt;
+}
+
+bool Camera::isrunning() const{
+ return running;
+}
+
+void Camera::grab() {
+ if (capture && capture->isOpened()){
+ Mat frame;
+ capture->read(frame);
+
+ if (!frame.empty()){
+ image = QImage((const uchar*)(frame.data), frame.cols, frame.rows, frame.step, QImage::Format_RGB888).rgbSwapped();
+ image = image.scaled(this->width(), this->height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+ update();
+ }
+ }
+}