Files
2021-08-23 15:30:49 +02:00

97 lines
3.0 KiB
C++
Executable File

#include <iostream>
#include "cl_class.h"
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/core/mat.hpp>
// Maximum number of corners.
#define FAST_COUNT (1 << 18)
int main() {
opencl gpu;
/*
gpu.make_kernel("int_add");
int A[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int B[] = { 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 };
gpu.write_buf(0,0,10,A);
gpu.write_buf(0,1,10,B);
int C[10];
gpu.run(0,10,1,1,2,10,C);
std::cout << " result: \n";
for (int i = 0; i < 10; i++){
std::cout << C[i] << " ";
}
std::cout << std::endl;
int A1[] = { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int B1[] = { 0, 1, 2, 0, 1, 2, 0, 1, 2, 10};
gpu.reload_buf(0,0,A1);
gpu.reload_buf(0,1,B1);
int C1[10];
gpu.run(0,10,1,1,2,10,C1);
std::cout << " result: \n";
for (int i = 0; i < 10; i++){
std::cout << C1[i] << " ";
}
std::cout << std::endl;
gpu.make_kernel("double_add");
double A2[] = { 0.2, 1.3, 2.5, 3.6, 4.9, 5.12, 6.5, 7.6, 8.4, 9.1 };
double B2[] = { 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 0.0, 1.0, 2.0, 0.0 };
gpu.write_buf(1,0,10,A2);
gpu.write_buf(1,1,10,B2);
double C2[10];
gpu.run(1,10,1,1,2,10,C2);
std::cout << " result: \n";
for (int i = 0; i < 10; i++){
std::cout << C2[i] << " ";
}
std::cout << std::endl;
*/
gpu.make_kernel("fast_gray");
cv::Mat img = cv::imread("../frame0287.jpg", CV_8UC1);
cv::Mat imageRGBA;
cv::Mat downSampled;
//cv::imshow("test2",img);
//cv::waitKey();
cv::resize(img, downSampled, cv::Size(752, 480));
cv::cvtColor(downSampled, imageRGBA, CV_GRAY2RGBA);
gpu.write_buf(0,0,downSampled);
//cv::imshow("test2",downSampled);
//cv::waitKey();
cl_int2 corners_[740*450];
gpu.write_buf(0,1,740*450,corners_);
int icorner[1]={0};
gpu.write_buf(0,2,1,icorner);
int fast_count=FAST_COUNT;
gpu.write_buf(0,3,fast_count);
printf("\nOpenCL version\n");
double time_accumulator = 0;
for(int i=0;i<1000;++i){
double t = (double)cv::getTickCount();
gpu.reload_buf(0,0,downSampled);
int icorner[1]={0};
gpu.reload_buf(0,2,icorner);
gpu.run(0,752,480,1);
time_accumulator += ((cv::getTickCount() - t) / cv::getTickFrequency());
}
printf("OpenCL took %f ms (average over %d trials).\n", time_accumulator/((double)1000)*1000.0, 1000 );
int icorner_[1]={0};
gpu.read(0,2,icorner_);
cl_int2 corners[740*450];
gpu.read(0,1,corners);
//double t = (double)cv::getTickCount();
//cv::Mat condition=cv::Mat::ones(cv::Size(752,480),CV_8UC1);
//gpu.run(2,752,480,1,6,360960,condition.data);
int count=0;
for(int i=0;i<icorner_[0];++i){
if(corners[i].x<0 || corners[i].x>750 || corners[i].y>450 || corners[i].y<0)continue;
cv::circle(imageRGBA, cv::Point(corners[i].x,corners[i].y ), 1, cv::Scalar(0, 0,255),1);
++count;
}
cv::imwrite("test3.png",imageRGBA);
std::cerr<<count<<'\n';
cv::waitKey();
gpu.clear_buf();
return 0;
}