33
44#include < opencv2/opencv.hpp>
55#include < iostream>
6+ #include < cstddef>
7+ #include < tuple>
68
9+ #include < thread>
10+ #include < chrono>
711
812
9- cv::Mat new_frame (cv::Mat &frame) {
10- // cv::Mat rgb_uchar_frame;
11- // cv::cvtColor(frame, rgb_uchar_frame, cv::COLOR_BGR2RGB);
12-
13- // cv::Mat rgb_float_frame;
14- // rgb_uchar_frame.convertTo(rgb_float_frame, CV_32FC3, 1.0f/255.0f);
15-
13+ std::tuple<cv::Mat,std::size_t > new_frame (cv::Mat &frame) {
1614
1715 cv::Mat rgb_float_frame;
1816 cv::cvtColor (frame, rgb_float_frame, cv::COLOR_BGR2RGB);
1917 rgb_float_frame.convertTo (rgb_float_frame, CV_32FC3, 1 .0f /255 .0f );
2018
21- // cv::MatSize size = rgb_frame.size;
22- // std::cout << "x " << size[0] << " y " << size[1] << " channels " << rgb_frame.dims << std::endl;
2319 int64_t height = rgb_float_frame.rows ;
2420 int64_t width = rgb_float_frame.cols ;
2521 int64_t channels = rgb_float_frame.channels ();
2622 int64_t pixels = rgb_float_frame.total ();
2723 int64_t size = pixels * channels;
2824
29- // std::cout << "Width: " << width << ", Height: " << height << ", Channels: " << channels << ", Size: " << size << std::endl;
30-
3125 chpl_external_array
3226 rgb_float_frame_data_ptr = chpl_make_external_array_ptr (rgb_float_frame.data ,size);
3327
28+ std::size_t chpl_start = cv::getTickCount ();
29+
3430 chpl_external_array
3531 rgb_float_output_frame_array = getNewFrame (&rgb_float_frame_data_ptr, height, width, channels);
3632
33+ std::size_t chpl_end = cv::getTickCount ();
34+
3735 chpl_free_external_array (rgb_float_frame_data_ptr);
3836
39- // cv::Mat new_rgb_frame(height, width, CV_8UC3,new_frame_array.elts);
40- // cv::cvtColor(new_rgb_frame, new_rgb_frame, cv::COLOR_RGB2BGR);
4137
4238 cv::Mat output_frame (height,width,CV_32FC3,rgb_float_output_frame_array.elts ); // frame to write to
4339 output_frame.convertTo (output_frame, CV_8UC3, 255 .0f );
4440 cv::cvtColor (output_frame, output_frame, cv::COLOR_RGB2BGR);
4541
4642 chpl_free_external_array (rgb_float_output_frame_array);
4743
48- return output_frame;
49-
50- // cv::Mat rgb_float_output_frame(height,width,CV_32FC3,rgb_float_output_frame_array.elts); // frame to write to
51-
52- // cv::Mat rgb_uchar_output_frame;
53- // rgb_float_output_frame.convertTo(rgb_uchar_output_frame, CV_8UC3, 255.0f);
54-
55- // cv::Mat bgr_uchar_output_frame;
56- // cv::cvtColor(rgb_uchar_output_frame, bgr_uchar_output_frame, cv::COLOR_RGB2BGR);
57-
58- // return bgr_uchar_output_frame;
59- }
60-
61- /*
62- cv::Mat new_frame(cv::Mat &frame) {
63- cv::Mat rgb_frame;
64- cv::cvtColor(frame, rgb_frame, cv::COLOR_BGR2RGB);
65- std::cout << "Frame size: " << rgb_frame.size() << std::endl;
66-
67- // cv::MatSize size = rgb_frame.size;
68- // std::cout << "x " << size[0] << " y " << size[1] << " channels " << rgb_frame.dims << std::endl;
69- int64_t width = rgb_frame.cols;
70- int64_t height = rgb_frame.rows;
71- int64_t channels = rgb_frame.channels();
72- int64_t pixels = rgb_frame.total();
73- int64_t size = pixels * channels;
74-
75- chpl_external_array frame_data_ptr = chpl_make_external_array_ptr(rgb_frame.data, size);
76- chpl_external_array new_frame_array = getNewFrame(&frame_data_ptr, width, height, channels);
77- chpl_free_external_array(frame_data_ptr);
78-
79- cv::Mat new_rgb_frame(height, width, CV_8UC3,new_frame_array.elts);
80- cv::cvtColor(new_rgb_frame, new_rgb_frame, cv::COLOR_RGB2BGR);
44+ std::tuple<cv::Mat,std::size_t > ouput_package = {output_frame,chpl_end - chpl_start};
45+ return ouput_package;
8146
82- return new_rgb_frame;
8347}
84- */
85-
86- /*
87- void new_frame(cv::Mat &frame) {
88- cv::Mat rgb_frame;
89- cv::cvtColor(frame, rgb_frame, cv::COLOR_BGR2RGB);
90- std::cout << "Frame size: " << rgb_frame.size() << std::endl;
91-
92- // cv::MatSize size = rgb_frame.size;
93- // std::cout << "x " << size[0] << " y " << size[1] << " channels " << rgb_frame.dims << std::endl;
94- int64_t width = rgb_frame.cols;
95- int64_t height = rgb_frame.rows;
96- int64_t channels = rgb_frame.channels();
97- int64_t size = rgb_frame.total() * channels;
98-
99- std::cout << "Width: " << width << ", Height: " << height << ", Channels: " << channels << ", Size: " << size << std::endl;
100-
101- // chpl_external_array frame_data_ptr = chpl_make_external_array_ptr(rgb_frame.data, );
102- }*/
10348
10449
10550int mirror () {
@@ -116,9 +61,12 @@ int mirror() {
11661 cv::Size original_frame_size;
11762 cv::Size processed_frame_size;
11863
64+ double last_frame_fps = 0.0 ;
65+ double last_chpl_fps = 0.0 ;
66+
11967 while (true ) {
12068
121- uint64_t start = cv::getTickCount ();
69+ std:: size_t frame_start = cv::getTickCount ();
12270
12371 // Capture a new frame from webcam
12472 cap >> frame;
@@ -137,7 +85,9 @@ int mirror() {
13785 // std::cout << "Frame size: " << frame.size() << std::endl;
13886 // std::cout << "New frame size: " << processed_frame_size << std::endl;
13987
140- cv::Mat next_frame = new_frame (frame);
88+ cv::Mat next_frame;
89+ std::size_t chpl_delta;
90+ std::tie (next_frame,chpl_delta) = new_frame (frame);
14191
14292 cv::resize (next_frame, next_frame, original_frame_size);
14393
@@ -150,10 +100,19 @@ int mirror() {
150100 break ;
151101 }
152102
153- double fps = cv::getTickFrequency () / (cv::getTickCount () - start);
154- std::cout << " \r cv::FPS : " << fps << " \t\r " << std::flush;
103+ std::size_t frame_end = cv::getTickCount ();
104+
105+ double frame_fps = cv::getTickFrequency () / (frame_end - frame_start);
106+ double chpl_fps = cv::getTickFrequency () / chpl_delta;
107+ std::cout << " \r cv::FPS : \t " << frame_fps << " chpl::FPS : \t " << chpl_fps << " \t\r " << std::flush;
108+ last_frame_fps = frame_fps;
109+ last_chpl_fps = chpl_fps;
155110 }
156111
112+ std::cout << " \n Last FPS: " << last_frame_fps << std::endl;
113+ std::cout << " Last CHPL FPS: " << last_chpl_fps << std::endl;
114+ std::cout << " Exiting webcam feed..." << std::endl;
115+
157116 // Release the camera and destroy all windows
158117 cap.release ();
159118 cv::destroyAllWindows ();
@@ -171,6 +130,11 @@ int main(int argc, char* argv[]) {
171130
172131 int code = mirror ();
173132
133+ std::size_t start = cv::getTickCount ();
134+ std::this_thread::sleep_for (std::chrono::milliseconds (2000 ));
135+ std::size_t end = cv::getTickCount ();
136+ std::cout << " Total time taken: " << (end - start) / cv::getTickFrequency () << " seconds" << std::endl;
137+
174138
175139 chpl_library_finalize ();
176140 return code;
0 commit comments