vendor: OpenCV 5.0.0 snapshot at 755e50675d97db9b7d449d8bd6b09888646f6c6e
This commit is contained in:
@@ -0,0 +1,257 @@
|
||||
#include "precomp.hpp"
|
||||
using namespace caffe;
|
||||
|
||||
namespace cv
|
||||
{
|
||||
namespace cnn_3dobj
|
||||
{
|
||||
descriptorExtractor::descriptorExtractor(const String& device_type, int device_id)
|
||||
{
|
||||
net_ready = 0;
|
||||
if (strcmp(device_type.c_str(), "CPU") == 0 || strcmp(device_type.c_str(), "GPU") == 0)
|
||||
{
|
||||
if (strcmp(device_type.c_str(), "CPU") == 0)
|
||||
{
|
||||
caffe::Caffe::set_mode(caffe::Caffe::CPU);
|
||||
deviceType = "CPU";
|
||||
std::cout << "Using CPU" << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
caffe::Caffe::set_mode(caffe::Caffe::GPU);
|
||||
caffe::Caffe::SetDevice(device_id);
|
||||
deviceType = "GPU";
|
||||
std::cout << "Using GPU" << std::endl;
|
||||
std::cout << "Using Device_id=" << device_id << std::endl;
|
||||
}
|
||||
net_set = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Error: Device name must be 'GPU' together with an device number or 'CPU'." << std::endl;
|
||||
net_set = false;
|
||||
}
|
||||
};
|
||||
|
||||
String descriptorExtractor::getDeviceType()
|
||||
{
|
||||
String device_info_out;
|
||||
device_info_out = deviceType;
|
||||
return device_info_out;
|
||||
};
|
||||
|
||||
int descriptorExtractor::getDeviceId()
|
||||
{
|
||||
int device_info_out;
|
||||
device_info_out = deviceId;
|
||||
return device_info_out;
|
||||
};
|
||||
|
||||
void descriptorExtractor::setDeviceType(const String& device_type)
|
||||
{
|
||||
if (strcmp(device_type.c_str(), "CPU") == 0 || strcmp(device_type.c_str(), "GPU") == 0)
|
||||
{
|
||||
if (strcmp(device_type.c_str(), "CPU") == 0)
|
||||
{
|
||||
caffe::Caffe::set_mode(caffe::Caffe::CPU);
|
||||
deviceType = "CPU";
|
||||
std::cout << "Using CPU" << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
caffe::Caffe::set_mode(caffe::Caffe::GPU);
|
||||
deviceType = "GPU";
|
||||
std::cout << "Using GPU" << std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Error: Device name must be 'GPU' or 'CPU'." << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
void descriptorExtractor::setDeviceId(const int& device_id)
|
||||
{
|
||||
if (strcmp(deviceType.c_str(), "GPU") == 0)
|
||||
{
|
||||
caffe::Caffe::SetDevice(device_id);
|
||||
deviceId = device_id;
|
||||
std::cout << "Using GPU with Device ID = " << device_id << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Error: Device ID only need to be set when GPU is used." << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
void descriptorExtractor::loadNet(const String& model_file, const String& trained_file, const String& mean_file)
|
||||
{
|
||||
if (net_set)
|
||||
{
|
||||
/* Load the network. */
|
||||
convnet = new Net<float>(model_file, TEST);
|
||||
convnet->CopyTrainedLayersFrom(trained_file);
|
||||
if (convnet->num_inputs() != 1)
|
||||
std::cout << "Network should have exactly one input." << std::endl;
|
||||
if (convnet->num_outputs() != 1)
|
||||
std::cout << "Network should have exactly one output." << std::endl;
|
||||
Blob<float>* input_layer = convnet->input_blobs()[0];
|
||||
num_channels = input_layer->channels();
|
||||
if (num_channels != 3 && num_channels != 1)
|
||||
std::cout << "Input layer should have 1 or 3 channels." << std::endl;
|
||||
input_geometry = cv::Size(input_layer->width(), input_layer->height());
|
||||
/* Load the binaryproto mean file. */
|
||||
if (!mean_file.empty())
|
||||
{
|
||||
setMean(mean_file);
|
||||
net_ready = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
net_ready = 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::cout << "Error: Net is not set properly in advance using construtor." << std::endl;
|
||||
}
|
||||
};
|
||||
|
||||
/* Load the mean file in binaryproto format. */
|
||||
void descriptorExtractor::setMean(const String& mean_file)
|
||||
{
|
||||
BlobProto blob_proto;
|
||||
ReadProtoFromBinaryFileOrDie(mean_file.c_str(), &blob_proto);
|
||||
/* Convert from BlobProto to Blob<float> */
|
||||
Blob<float> mean_blob;
|
||||
mean_blob.FromProto(blob_proto);
|
||||
if (mean_blob.channels() != num_channels)
|
||||
std::cout << "Number of channels of mean file doesn't match input layer." << std::endl;
|
||||
/* The format of the mean file is planar 32-bit float BGR or grayscale. */
|
||||
std::vector<cv::Mat> channels;
|
||||
float* data = mean_blob.mutable_cpu_data();
|
||||
for (int i = 0; i < num_channels; ++i)
|
||||
{
|
||||
/* Extract an individual channel. */
|
||||
cv::Mat channel(mean_blob.height(), mean_blob.width(), CV_32FC1, data);
|
||||
channels.push_back(channel);
|
||||
data += mean_blob.height() * mean_blob.width();
|
||||
}
|
||||
/* Merge the separate channels into a single image. */
|
||||
cv::Mat mean;
|
||||
cv::merge(channels, mean);
|
||||
/* Compute the global mean pixel value and create a mean image
|
||||
* filled with this value. */
|
||||
cv::Scalar channel_mean = cv::mean(mean);
|
||||
mean_ = cv::Mat(input_geometry, mean.type(), channel_mean);
|
||||
};
|
||||
|
||||
void descriptorExtractor::extract(InputArrayOfArrays inputimg, OutputArray feature, String feature_blob)
|
||||
{
|
||||
if (net_ready)
|
||||
{
|
||||
Blob<float>* input_layer = convnet->input_blobs()[0];
|
||||
input_layer->Reshape(1, num_channels,
|
||||
input_geometry.height, input_geometry.width);
|
||||
/* Forward dimension change to all layers. */
|
||||
convnet->Reshape();
|
||||
std::vector<cv::Mat> input_channels;
|
||||
wrapInput(&input_channels);
|
||||
if (inputimg.kind() == 65536)
|
||||
{/* this is a Mat */
|
||||
Mat img = inputimg.getMat();
|
||||
preprocess(img, &input_channels);
|
||||
convnet->ForwardPrefilled();
|
||||
/* Copy the output layer to a std::vector */
|
||||
Blob<float>* output_layer = convnet->blob_by_name(feature_blob).get();
|
||||
const float* begin = output_layer->cpu_data();
|
||||
const float* end = begin + output_layer->channels();
|
||||
std::vector<float> featureVec = std::vector<float>(begin, end);
|
||||
cv::Mat feature_mat = cv::Mat(featureVec, true).t();
|
||||
feature_mat.copyTo(feature);
|
||||
}
|
||||
else
|
||||
{/* This is a vector<Mat> */
|
||||
vector<Mat> img;
|
||||
inputimg.getMatVector(img);
|
||||
Mat feature_vector;
|
||||
for (unsigned int i = 0; i < img.size(); ++i)
|
||||
{
|
||||
preprocess(img[i], &input_channels);
|
||||
convnet->ForwardPrefilled();
|
||||
/* Copy the output layer to a std::vector */
|
||||
Blob<float>* output_layer = convnet->blob_by_name(feature_blob).get();
|
||||
const float* begin = output_layer->cpu_data();
|
||||
const float* end = begin + output_layer->channels();
|
||||
std::vector<float> featureVec = std::vector<float>(begin, end);
|
||||
if (i == 0)
|
||||
{
|
||||
feature_vector = cv::Mat(featureVec, true).t();
|
||||
int dim_feature = feature_vector.cols;
|
||||
feature_vector.resize(img.size(), dim_feature);
|
||||
}
|
||||
feature_vector.row(i) = cv::Mat(featureVec, true).t();
|
||||
}
|
||||
feature_vector.copyTo(feature);
|
||||
}
|
||||
}
|
||||
else
|
||||
std::cout << "Device must be set properly using constructor and the net must be set in advance using loadNet.";
|
||||
};
|
||||
|
||||
/* Wrap the input layer of the network in separate cv::Mat objects
|
||||
* (one per channel). This way we save one memcpy operation and we
|
||||
* don't need to rely on cudaMemcpy2D. The last preprocessing
|
||||
* operation will write the separate channels directly to the input
|
||||
* layer. */
|
||||
void descriptorExtractor::wrapInput(std::vector<cv::Mat>* input_channels)
|
||||
{
|
||||
Blob<float>* input_layer = convnet->input_blobs()[0];
|
||||
int width = input_layer->width();
|
||||
int height = input_layer->height();
|
||||
float* input_data = input_layer->mutable_cpu_data();
|
||||
for (int i = 0; i < input_layer->channels(); ++i)
|
||||
{
|
||||
cv::Mat channel(height, width, CV_32FC1, input_data);
|
||||
input_channels->push_back(channel);
|
||||
input_data += width * height;
|
||||
}
|
||||
};
|
||||
|
||||
void descriptorExtractor::preprocess(const cv::Mat& img, std::vector<cv::Mat>* input_channels)
|
||||
{
|
||||
/* Convert the input image to the input image format of the network. */
|
||||
cv::Mat sample;
|
||||
if (num_channels == 1)
|
||||
cv::cvtColor(img, sample, COLOR_BGR2GRAY);
|
||||
else if (img.channels() == 4 && num_channels == 3)
|
||||
cv::cvtColor(img, sample, COLOR_BGRA2BGR);
|
||||
else if (img.channels() == 1 && num_channels == 3)
|
||||
cv::cvtColor(img, sample, COLOR_GRAY2BGR);
|
||||
else
|
||||
sample = img;
|
||||
|
||||
cv::Mat sample_resized;
|
||||
if (sample.size() != input_geometry)
|
||||
cv::resize(sample, sample_resized, input_geometry);
|
||||
else
|
||||
sample_resized = sample;
|
||||
|
||||
cv::Mat sample_float;
|
||||
sample_resized.convertTo(sample_float, CV_32F);
|
||||
|
||||
cv::Mat sample_normalized;
|
||||
if (net_ready == 2)
|
||||
cv::subtract(sample_float, mean_, sample_normalized);
|
||||
else
|
||||
sample_normalized = sample_float;
|
||||
/* This operation will write the separate BGR planes directly to the
|
||||
* input layer of the network because it is wrapped by the cv::Mat
|
||||
* objects in input_channels. */
|
||||
cv::split(sample_normalized, *input_channels);
|
||||
if (reinterpret_cast<float*>(input_channels->at(0).data)
|
||||
!= convnet->input_blobs()[0]->cpu_data())
|
||||
std::cout << "Input channels are not wrapping the input layer of the network." << std::endl;
|
||||
};
|
||||
} /* namespace cnn_3dobj */
|
||||
} /* namespace cv */
|
||||
@@ -0,0 +1,265 @@
|
||||
#include "precomp.hpp"
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
namespace cv
|
||||
{
|
||||
namespace cnn_3dobj
|
||||
{
|
||||
icoSphere::icoSphere(float radius_in, int depth_in)
|
||||
{
|
||||
X = 0.5f;
|
||||
Z = 0.5f;
|
||||
float vdata[12][3] = { { -X, 0.0f, Z }, { X, 0.0f, Z },
|
||||
{ -X, 0.0f, -Z }, { X, 0.0f, -Z }, { 0.0f, Z, X }, { 0.0f, Z, -X },
|
||||
{ 0.0f, -Z, X }, { 0.0f, -Z, -X }, { Z, X, 0.0f }, { -Z, X, 0.0f },
|
||||
{ Z, -X, 0.0f }, { -Z, -X, 0.0f } };
|
||||
int tindices[20][3] = { { 0, 4, 1 }, { 0, 9, 4 }, { 9, 5, 4 },
|
||||
{ 4, 5, 8 }, { 4, 8, 1 }, { 8, 10, 1 }, { 8, 3, 10 }, { 5, 3, 8 },
|
||||
{ 5, 2, 3 }, { 2, 7, 3 }, { 7, 10, 3 }, { 7, 6, 10 }, { 7, 11, 6 },
|
||||
{ 11, 0, 6 }, { 0, 1, 6 }, { 6, 1, 10 }, { 9, 0, 11 },
|
||||
{ 9, 11, 2 }, { 9, 2, 5 }, { 7, 2, 11 } };
|
||||
diff = 0.00000001;
|
||||
X *= (int)radius_in;
|
||||
Z *= (int)radius_in;
|
||||
|
||||
// Iterate over points
|
||||
for (int i = 0; i < 20; ++i)
|
||||
{
|
||||
subdivide(vdata[tindices[i][0]], vdata[tindices[i][1]],
|
||||
vdata[tindices[i][2]], depth_in);
|
||||
}
|
||||
CameraPos_temp.push_back(CameraPos[0]);
|
||||
for (unsigned int j = 1; j < CameraPos.size(); ++j)
|
||||
{
|
||||
for (unsigned int k = 0; k < j; ++k)
|
||||
{
|
||||
float dist_x, dist_y, dist_z;
|
||||
dist_x = (CameraPos.at(k).x-CameraPos.at(j).x) * (CameraPos.at(k).x-CameraPos.at(j).x);
|
||||
dist_y = (CameraPos.at(k).y-CameraPos.at(j).y) * (CameraPos.at(k).y-CameraPos.at(j).y);
|
||||
dist_z = (CameraPos.at(k).z-CameraPos.at(j).z) * (CameraPos.at(k).z-CameraPos.at(j).z);
|
||||
if (dist_x < diff && dist_y < diff && dist_z < diff)
|
||||
break;
|
||||
else if (k == j-1)
|
||||
CameraPos_temp.push_back(CameraPos[j]);
|
||||
}
|
||||
}
|
||||
CameraPos = CameraPos_temp;
|
||||
cout << "View points in total: " << CameraPos.size() << endl;
|
||||
cout << "The coordinate of view point: " << endl;
|
||||
for(unsigned int i = 0; i < CameraPos.size(); i++)
|
||||
{
|
||||
cout << CameraPos.at(i).x <<' '<< CameraPos.at(i).y << ' ' << CameraPos.at(i).z << endl;
|
||||
}
|
||||
};
|
||||
void icoSphere::norm(float v[])
|
||||
{
|
||||
float len = 0;
|
||||
for (int i = 0; i < 3; ++i)
|
||||
{
|
||||
len += v[i] * v[i];
|
||||
}
|
||||
len = sqrt(len);
|
||||
for (int i = 0; i < 3; ++i)
|
||||
{
|
||||
v[i] /= ((float)len);
|
||||
}
|
||||
};
|
||||
|
||||
void icoSphere::add(float v[])
|
||||
{
|
||||
Point3f temp_Campos;
|
||||
std::vector<float>* temp = new std::vector<float>;
|
||||
for (int k = 0; k < 3; ++k)
|
||||
{
|
||||
temp->push_back(v[k]);
|
||||
}
|
||||
temp_Campos.x = temp->at(0);temp_Campos.y = temp->at(1);temp_Campos.z = temp->at(2);
|
||||
CameraPos.push_back(temp_Campos);
|
||||
};
|
||||
|
||||
void icoSphere::subdivide(float v1[], float v2[], float v3[], int depth)
|
||||
{
|
||||
norm(v1);
|
||||
norm(v2);
|
||||
norm(v3);
|
||||
if (depth == 0)
|
||||
{
|
||||
add(v1);
|
||||
add(v2);
|
||||
add(v3);
|
||||
return;
|
||||
}
|
||||
float* v12 = new float[3];
|
||||
float* v23 = new float[3];
|
||||
float* v31 = new float[3];
|
||||
for (int i = 0; i < 3; ++i)
|
||||
{
|
||||
v12[i] = (v1[i] + v2[i]) / 2;
|
||||
v23[i] = (v2[i] + v3[i]) / 2;
|
||||
v31[i] = (v3[i] + v1[i]) / 2;
|
||||
}
|
||||
norm(v12);
|
||||
norm(v23);
|
||||
norm(v31);
|
||||
subdivide(v1, v12, v31, depth - 1);
|
||||
subdivide(v2, v23, v12, depth - 1);
|
||||
subdivide(v3, v31, v23, depth - 1);
|
||||
subdivide(v12, v23, v31, depth - 1);
|
||||
};
|
||||
|
||||
int icoSphere::swapEndian(int val)
|
||||
{
|
||||
val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF);
|
||||
return (val << 16) | (val >> 16);
|
||||
};
|
||||
|
||||
cv::Point3d icoSphere::getCenter(cv::Mat cloud)
|
||||
{
|
||||
Point3f* data = cloud.ptr<cv::Point3f>();
|
||||
Point3d dataout;
|
||||
for(int i = 0; i < cloud.cols; ++i)
|
||||
{
|
||||
dataout.x += data[i].x;
|
||||
dataout.y += data[i].y;
|
||||
dataout.z += data[i].z;
|
||||
}
|
||||
dataout.x = dataout.x/cloud.cols;
|
||||
dataout.y = dataout.y/cloud.cols;
|
||||
dataout.z = dataout.z/cloud.cols;
|
||||
return dataout;
|
||||
};
|
||||
|
||||
float icoSphere::getRadius(cv::Mat cloud, cv::Point3d center)
|
||||
{
|
||||
float radiusCam = 0;
|
||||
Point3f* data = cloud.ptr<cv::Point3f>();
|
||||
Point3d datatemp;
|
||||
for(int i = 0; i < cloud.cols; ++i)
|
||||
{
|
||||
datatemp.x = data[i].x - (float)center.x;
|
||||
datatemp.y = data[i].y - (float)center.y;
|
||||
datatemp.z = data[i].z - (float)center.z;
|
||||
float Radius = sqrt(pow(datatemp.x,2)+pow(datatemp.y,2)+pow(datatemp.z,2));
|
||||
if(Radius > radiusCam)
|
||||
{
|
||||
radiusCam = Radius;
|
||||
}
|
||||
}
|
||||
return radiusCam;
|
||||
};
|
||||
|
||||
void icoSphere::createHeader(int num_item, int rows, int cols, const char* headerPath)
|
||||
{
|
||||
char* a0 = (char*)malloc(1024);
|
||||
strcpy(a0, headerPath);
|
||||
char a1[] = "image";
|
||||
char a2[] = "label";
|
||||
char* headerPathimg = (char*)malloc(1024);
|
||||
strcpy(headerPathimg, a0);
|
||||
strcat(headerPathimg, a1);
|
||||
char* headerPathlab = (char*)malloc(1024);
|
||||
strcpy(headerPathlab, a0);
|
||||
strcat(headerPathlab, a2);
|
||||
std::ofstream headerImg(headerPathimg, ios::out|ios::binary);
|
||||
std::ofstream headerLabel(headerPathlab, ios::out|ios::binary);
|
||||
int headerimg[4] = {2051,num_item,rows,cols};
|
||||
for (int i=0; i<4; i++)
|
||||
headerimg[i] = swapEndian(headerimg[i]);
|
||||
int headerlabel[2] = {2050,num_item};
|
||||
for (int i=0; i<2; i++)
|
||||
headerlabel[i] = swapEndian(headerlabel[i]);
|
||||
headerImg.write(reinterpret_cast<const char*>(headerimg), sizeof(int)*4);
|
||||
headerImg.close();
|
||||
headerLabel.write(reinterpret_cast<const char*>(headerlabel), sizeof(int)*2);
|
||||
headerLabel.close();
|
||||
};
|
||||
|
||||
void icoSphere::writeBinaryfile(String filenameImg, const char* binaryPath, const char* headerPath, int num_item, int label_class, int x, int y, int z, int isrgb)
|
||||
{
|
||||
cv::Mat ImgforBin = cv::imread(filenameImg, isrgb);
|
||||
char* A0 = (char*)malloc(1024);
|
||||
strcpy(A0, binaryPath);
|
||||
char A1[] = "image";
|
||||
char A2[] = "label";
|
||||
char* binPathimg = (char*)malloc(1024);
|
||||
strcpy(binPathimg, A0);
|
||||
strcat(binPathimg, A1);
|
||||
char* binPathlab = (char*)malloc(1024);
|
||||
strcpy(binPathlab, A0);
|
||||
strcat(binPathlab, A2);
|
||||
fstream img_file, lab_file;
|
||||
img_file.open(binPathimg,ios::in);
|
||||
lab_file.open(binPathlab,ios::in);
|
||||
if(!img_file)
|
||||
{
|
||||
cout << "Creating the training data at: " << binaryPath << ". " << endl;
|
||||
char* a0 = (char*)malloc(1024);
|
||||
strcpy(a0, headerPath);
|
||||
char a1[] = "image";
|
||||
char a2[] = "label";
|
||||
char* headerPathimg = (char*)malloc(1024);
|
||||
strcpy(headerPathimg, a0);
|
||||
strcat(headerPathimg,a1);
|
||||
char* headerPathlab = (char*)malloc(1024);
|
||||
strcpy(headerPathlab, a0);
|
||||
strcat(headerPathlab,a2);
|
||||
createHeader(num_item, 64, 64, binaryPath);
|
||||
img_file.open(binPathimg,ios::out|ios::binary|ios::app);
|
||||
lab_file.open(binPathlab,ios::out|ios::binary|ios::app);
|
||||
if (isrgb == 0)
|
||||
{
|
||||
for (int r = 0; r < ImgforBin.rows; r++)
|
||||
{
|
||||
img_file.write(reinterpret_cast<const char*>(ImgforBin.ptr(r)), ImgforBin.cols*ImgforBin.elemSize());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::vector<cv::Mat> Img3forBin;
|
||||
cv::split(ImgforBin,Img3forBin);
|
||||
for (unsigned int i = 0; i < Img3forBin.size(); i++)
|
||||
{
|
||||
for (int r = 0; r < Img3forBin[i].rows; r++)
|
||||
{
|
||||
img_file.write(reinterpret_cast<const char*>(Img3forBin[i].ptr(r)), Img3forBin[i].cols*Img3forBin[i].elemSize());
|
||||
}
|
||||
}
|
||||
}
|
||||
signed char templab = (signed char)label_class;
|
||||
lab_file << templab << (signed char)x << (signed char)y << (signed char)z;
|
||||
}
|
||||
else
|
||||
{
|
||||
img_file.close();
|
||||
lab_file.close();
|
||||
img_file.open(binPathimg,ios::out|ios::binary|ios::app);
|
||||
lab_file.open(binPathlab,ios::out|ios::binary|ios::app);
|
||||
cout <<"Concatenating the training data at: " << binaryPath << ". " << endl;
|
||||
if (isrgb == 0)
|
||||
{
|
||||
for (int r = 0; r < ImgforBin.rows; r++)
|
||||
{
|
||||
img_file.write(reinterpret_cast<const char*>(ImgforBin.ptr(r)), ImgforBin.cols*ImgforBin.elemSize());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::vector<cv::Mat> Img3forBin;
|
||||
cv::split(ImgforBin,Img3forBin);
|
||||
for (unsigned int i = 0; i < Img3forBin.size(); i++)
|
||||
{
|
||||
for (int r = 0; r < Img3forBin[i].rows; r++)
|
||||
{
|
||||
img_file.write(reinterpret_cast<const char*>(Img3forBin[i].ptr(r)), Img3forBin[i].cols*Img3forBin[i].elemSize());
|
||||
}
|
||||
}
|
||||
}
|
||||
signed char templab = (signed char)label_class;
|
||||
lab_file << templab << (signed char)x << (signed char)y << (signed char)z;
|
||||
}
|
||||
img_file.close();
|
||||
lab_file.close();
|
||||
};
|
||||
} /* namespace cnn_3dobj */
|
||||
} /* namespace cv */
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
|
||||
By downloading, copying, installing or using the software you agree to this
|
||||
license. If you do not agree to this license, do not download, install,
|
||||
copy or use the software.
|
||||
|
||||
|
||||
License Agreement
|
||||
For Open Source Computer Vision Library
|
||||
(3-clause BSD License)
|
||||
|
||||
Copyright (C) 2013, OpenCV Foundation, all rights reserved.
|
||||
Third party copyrights are property of their respective owners.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without modification,
|
||||
are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* Neither the names of the copyright holders nor the names of the contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
This software is provided by the copyright holders and contributors "as is" and
|
||||
any express or implied warranties, including, but not limited to, the implied
|
||||
warranties of merchantability and fitness for a particular purpose are
|
||||
disclaimed. In no event shall copyright holders or contributors be liable for
|
||||
any direct, indirect, incidental, special, exemplary, or consequential damages
|
||||
(including, but not limited to, procurement of substitute goods or services;
|
||||
loss of use, data, or profits; or business interruption) however caused
|
||||
and on any theory of liability, whether in contract, strict liability,
|
||||
or tort (including negligence or otherwise) arising in any way out of
|
||||
the use of this software, even if advised of the possibility of such damage.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __OPENCV_CNN_3DOBJ_PRECOMP_HPP__
|
||||
#define __OPENCV_CNN_3DOBJ_PRECOMP_HPP__
|
||||
|
||||
#include <opencv2/cnn_3dobj.hpp>
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user