C++常用方法笔记资料
C++常用方法筆記資料
目錄
?
目錄
C++常用方法筆記資料
VS中常用的設(shè)置
C++函數(shù)注釋規(guī)范:
使用fprintf保存數(shù)據(jù)
C++和OpenCV的Debug文件
獲得路徑中的文件名和文件前綴和后綴名
統(tǒng)計數(shù)組中每個元素出現(xiàn)的次數(shù)
數(shù)組與vector互轉(zhuǎn)
openCV與vector互轉(zhuǎn)
vector自定義排序方式
vector自定義查找元素
C++獲取文件的時間等信息:#include
JNI C++接口的筆記
size_t 和 size_type的區(qū)別
Cmake構(gòu)建項目:
VS中常用的設(shè)置
$(SolutionDir):表示當(dāng)前解決方案的目錄,如設(shè)置頭文件路徑可這樣:$(SolutionDir)/extern/include;
$(ProjectDir):當(dāng)前項目的目錄路徑
MFC應(yīng)用程序顯示控制臺打印信息:生成事件->后期生成事件->命令行 中添加 :editbin /subsystem:console $(OutDir)\$(TargetName).exe,這樣cout或者printf就可以向控制臺輸出信息了
C++函數(shù)注釋規(guī)范:
/******************************************************** * @brief : 函數(shù)實現(xiàn)功能 * @param para1: 參數(shù)說明 * @param para2: 參數(shù)說明 * @return : 返回內(nèi)容 ********************************************************/ int fun(int para1,float para2);使用fprintf保存數(shù)據(jù)
int main() {char name[20] = "lucy";FILE *out;out = fopen("output.txt", "w");if (out != NULL)fprintf(out, "%s\n", name);return 0; }C++和OpenCV的Debug文件
Debug.h:
#ifndef DETECT_DEBUG_H #define DETECT_DEBUG_H #include "opencv2/opencv.hpp" #include <chrono>#define millisecond 1000000using namespace std; //debug info ON-OFF #define __DEBUG__ON #ifdef __DEBUG__ON #define __DEBUG__WIN__ON //Window debug:print debug info #define __DEBUG__IMSHOW__ON //show debug images #define __DEBUG__IMWRITE__OFF //write debug images #define __DEBUG__TIME__ON //run times test on/off #define __DEBUG__ANDROID__OFF //android debug on/off//#include <assert.h> //#define DEBUG_ASSERT(...) assert( __VA_ARGS__) //#define DEBUG_CV_ASSERT(...) CV_Assert( __VA_ARGS__)#else #define __DEBUG__ON(format,...) #endif//print debug info #ifdef __DEBUG__WIN__ON //#define DEBUG_PRINT(...) printf("File: %s, Line: %05d: "format"", __FILE__,__LINE__, ##__VA_ARGS__) #define DEBUG_PRINT(...) printf( __VA_ARGS__);printf("\n") #else #define DEBUG_PRINT(format,...) #endif//show debug images #ifdef __DEBUG__IMSHOW__ON #define DEBUG_IMSHOW(...) showImages(__VA_ARGS__) #else #define DEBUG_IMSHOW(format,...) #endif//write debug images #ifdef __DEBUG__IMWRITE__ON #define DEBUG_IMWRITE(...) saveImage(__VA_ARGS__) #else #define DEBUG_IMWRITE(format,...) #endif//write debug images #ifdef __DEBUG__ANDROID__ON #include <android/log.h> // Define the LOGI and others for print debug infomation like the log.i in java #define LOG_TAG "SmartAlbum -- JNILOG" //#undef LOG #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN,LOG_TAG, __VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG, __VA_ARGS__) #define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,LOG_TAG, __VA_ARGS__) #else #ifdef __DEBUG__WIN__ON #define LOGI(...) printf( __VA_ARGS__); printf("\n") #define LOGD(...) printf( __VA_ARGS__); printf("\n") #define LOGW(...) printf( __VA_ARGS__); printf("\n") #define LOGE(...) printf( __VA_ARGS__); printf("\n") #define LOGF(...) printf( __VA_ARGS__); printf("\n") #else #define LOGI(...) #define LOGD(...) #define LOGW(...) #define LOGE(...) #define LOGF(...) #endif #endif//run times test... #ifdef __DEBUG__TIME__ON #define LOG_TIME LOGE #define RUN_TIME(time_) (double)(time_).count()/millisecond //#define RUN_TIME(...) getTime_MS( __VA_ARGS__)//設(shè)置計算運行時間的宏定義 #define DEBUG_TIME(time_) auto time_ =std::chrono::high_resolution_clock::now() #define DEBUG_TIME_PRINT(time_) printf("run time: %s=%3.3f ms\n", #time_,(double)(time_).count()/millisecond) #else #define DEBUG_TIME(time_) #endiftemplate<typename TYPE> void PRINT_1D(string name,TYPE *p1, int len) {printf("%s", name.c_str());for (int i = 0; i < len; i++) {printf("%f,", p1[i]);}cout << endl; }void showImages(const char *imageName, cv::Mat image); void showImages(const char *imageName, cv::Mat img, cv::Rect face); void showImages(const char *imageName, cv::Mat img, cv::Rect face, std::vector<cv::Point> pts); void showImages(const char *imageName, cv::Mat img, std::vector<cv::Point> pts);void saveImage(const char *imageName, cv::Mat image); void saveImage(const char *imageName, cv::Mat image, std::vector<int> para); void saveImage(const char *imageName, cv::Mat image, cv::Rect face, std::vector<cv::Point> pts); void saveImage(const char *imageName, cv::Mat img, cv::Rect face);vector<string> getFilesList(string dir); void writeDatatxt(string path, string data, bool bCover=false);#ifdef linux #define _LINUX #define separator "/"#endif #ifdef _WIN32//__WINDOWS_ #define _WINDOWS #define separator "\\" #endif#endifDebug.cpp:
#include "opencv2/opencv.hpp" using namespace std; #include "debug.h"//*************************************顯示圖片**************************************** #define RESIZE(img_show,col) cv::resize(img_show, img_show, cv::Size(col, img_show.rows*col / img_show.cols))void showImages(const char *imageName, cv::Mat img) {cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);//char str[200];char str1[200];strcpy(str1, imageName);//sprintf(str, ",Size:%dx%d", image.rows, image.cols);//strcat(str1, str);RESIZE(img_show, 400);cv::imshow(str1, img_show);cv::waitKey(100); }void showImages(const char *imageName, cv::Mat img, cv::Rect face, std::vector<cv::Point> pts) {cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);for (int i = 0; i < pts.size(); ++i) {//std::cout << "index: " << i << std::endl;cv::circle(img_show, pts.at(i), 2.f, cv::Scalar(0, 0, 255), -1, CV_AA);// char str[3];// itoa(i, str, 10);// //line(imgDrawFace, cv::Point(shape.part(i).x(), shape.part(i).y()), cv::Point(shape.part(i).x(), shape.part(i).y()), cv::Scalar(0, i * 3, 255), 2);// putText(img_show, str, pts.at(i), cv::FONT_HERSHEY_DUPLEX, 0.5, cv::Scalar(255, 0, 0));}cv::rectangle(img_show, face, { 255, 0, 0 }, 2);char str[200];char str1[200];strcpy(str1, imageName);//sprintf(str, ",Size:%dx%d", img.rows, img.cols);//strcat(str1, str);RESIZE(img_show, 400);cv::imshow(str1, img_show);cv::waitKey(100); }void showImages(const char *imageName, cv::Mat img, std::vector<cv::Point> pts) {cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);for (int i = 0; i < pts.size(); ++i) {//std::cout << "index: " << i << std::endl;cv::circle(img_show, pts.at(i), 2.f, cv::Scalar(0, 0, 255), -1, CV_AA);// char str[3];// itoa(i, str, 10);// //line(imgDrawFace, cv::Point(shape.part(i).x(), shape.part(i).y()), cv::Point(shape.part(i).x(), shape.part(i).y()), cv::Scalar(0, i * 3, 255), 2);// putText(img_show, str, pts.at(i), cv::FONT_HERSHEY_DUPLEX, 0.5, cv::Scalar(255, 0, 0));}char str[200];char str1[200];strcpy(str1, imageName);//sprintf(str, ",Size:%dx%d", img.rows, img.cols);//strcat(str1, str);RESIZE(img_show, 400);cv::imshow(str1, img_show);cv::waitKey(100); }void showImages(const char *imageName, cv::Mat img, cv::Rect face) {int thickness = img.cols*0.005;thickness = thickness > 1 ? thickness : 1;cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);cv::rectangle(img_show, face, { 255, 0, 0 }, thickness);char str[200];char str1[200];strcpy(str1, imageName);//sprintf(str, ",Size:%dx%d", img.rows, img.cols);//strcat(str1, str);RESIZE(img_show, 400);cv::imshow(str1, img_show);cv::waitKey(100); }//*************************************保存圖片****************************************void saveImage(const char *imageName, cv::Mat image) {cv::imwrite(imageName, image); }void saveImage(const char *imageName, cv::Mat image, std::vector<int> para) {cv::imwrite(imageName, image, para); }void saveImage(const char *imageName, cv::Mat image, cv::Rect face, std::vector<cv::Point> pts) {int thickness = image.cols*0.005;thickness = thickness > 1 ? thickness : 1;cv::Mat img = image.clone();for (int i = 0; i < pts.size(); ++i) {//std::cout << "index: " << i << std::endl;cv::circle(img, pts.at(i), 2.f, cv::Scalar(0, 0, 255), thickness, CV_AA);}cv::rectangle(img, face, { 255, 0, 0 }, thickness);cv::imwrite(imageName, img); }void saveImage(const char *imageName, cv::Mat img, cv::Rect face) {cv::Mat img_show = img.clone();if (img_show.channels() == 1)cvtColor(img_show, img_show, cv::COLOR_GRAY2BGR);cv::rectangle(img_show, face, { 255, 0, 0 }, 2);cv::imwrite(imageName, img_show); }//*************************************獲取文件列表**************************************** #ifdef _LINUX #include <memory.h> #include <dirent.h> vector<string> getFilesList(string dirpath) {vector<string> allPath;DIR *dir = opendir(dirpath.c_str());if (dir == NULL){cout << "opendir error" << endl;return allPath;}struct dirent *entry;while ((entry = readdir(dir)) != NULL){if (entry->d_type == DT_DIR) {//It's dir if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)continue;string dirNew = dirpath + separator + entry->d_name;vector<string> tempPath = getFilesList(dirNew);allPath.insert(allPath.end(), tempPath.begin(), tempPath.end());}else {//cout << "name = " << entry->d_name << ", len = " << entry->d_reclen << ", entry->d_type = " << (int)entry->d_type << endl; string name = entry->d_name;string imgdir = dirpath + separator + name;//sprintf("%s",imgdir.c_str()); allPath.push_back(imgdir);}}closedir(dir);//system("pause"); return allPath; } #endif #ifdef _WIN32//__WINDOWS_ #include <io.h> vector<string> getFilesList(string dir) {vector<string> allPath;// 在目錄后面加上"\\*.*"進(jìn)行第一次搜索 string dir2 = dir + separator+"*.*";intptr_t handle;_finddata_t findData;handle = _findfirst(dir2.c_str(), &findData);if (handle == -1) {// 檢查是否成功 cout << "can not found the file ... " << endl;return allPath;}while (_findnext(handle, &findData) == 0){if (findData.attrib & _A_SUBDIR) 是否含有子目錄 {//若該子目錄為"."或"..",則進(jìn)行下一次循環(huán),否則輸出子目錄名,并進(jìn)入下一次搜索 if (strcmp(findData.name, ".") == 0 || strcmp(findData.name, "..") == 0)continue;// 在目錄后面加上"\\"和搜索到的目錄名進(jìn)行下一次搜索 string dirNew = dir + separator + findData.name;vector<string> tempPath = getFilesList(dirNew);allPath.insert(allPath.end(), tempPath.begin(), tempPath.end());}else //不是子目錄,即是文件,則輸出文件名和文件的大小 {string filePath = dir + separator + findData.name;allPath.push_back(filePath);}}_findclose(handle); // 關(guān)閉搜索句柄 return allPath; } #endif //***********************************將數(shù)據(jù)保存到txt文本中************************************* void writeDatatxt(string path, string data, bool bCover) {//fstream fout(path, ios::app);fstream fout;if (bCover){fout.open(path);//默認(rèn)是:ios_base::in | ios_base::out}else{fout.open(path, ios::app);//所有寫入附加在文件末尾}fout << data << endl;fout.flush();fout.close(); }獲得路徑中的文件名和文件前綴和后綴名
#define separator "\\"//分隔符 string image_path="D:\\dataset\\test.jpg" string output_dir="D:\\out-dataset" int index = image_path.find_last_of(separator);//獲得最后一個“\\”的位置 string full_name = image_path.substr(index + 1);//獲得文件名test.jpg int prex_index = full_name.find_last_of('.');//獲得最后一個“.”的位置 string prex_name = full_name.substr(0, prex_index);//獲得文件名前綴test string out_test_image = output_dir + separator + prex_name + "-lut.jpg";//結(jié)果為D:\\out-dataset\\test-lut.jpg統(tǒng)計數(shù)組中每個元素出現(xiàn)的次數(shù)
?基本解決思路:
? ? ?首先我們聲明一個大小和inputArray一樣的數(shù)組countryArray,并將每個元素值初始化為-1,用來存儲每個元素的頻率。這需要一些技巧來達(dá)到和HashMap一樣的效果卻也不損失太多性能。
? ? ?if countArray[i] == -1,表示我們還沒有統(tǒng)計inputArray[i]這個元素的頻率; if countArray[i] == 0,表示我們已經(jīng)統(tǒng)計過元素inputArray[i]的頻率了。
? ? ?用循環(huán)遍歷InputArray,from 0 到 N-1,統(tǒng)計每個元素的頻率。
? ? ?對于當(dāng)前元素inputArray[i],if countArray[i] == -1,我們就保存這個元素的頻率到countArray[i];否則,不保存,因為之前已經(jīng)統(tǒng)計過它了
#include <iostream> using namespace std;int main() {/*********************************************************************************/int inputArray[12] = {9,1,2,1,3,1,2,2,3,4,9,9};int countArray[12];int elementCount = 12;int i, j, count;/* Read array elements */for (i = 0; i < elementCount; i++) {countArray[i] = -1;}/** for any element inputArray[i], If countArray[i] = -1,* that means frequency is not counted for this number yet* and countArray[i] = 0 means frequency is already* counted for this number.*/for (i = 0; i < elementCount; i++) {count = 1;for (j = i + 1; j < elementCount; j++) {if (inputArray[i] == inputArray[j]) {countArray[j] = 0;//已經(jīng)統(tǒng)計過置為0count++;}}if (countArray[i] != 0) {countArray[i] = count;//記錄首次出現(xiàn)的值在數(shù)組中出現(xiàn)的個數(shù)}}/* Print count of each element */for (i = 0; i<elementCount; i++) {if (countArray[i] != 0) {printf("Element %d : Count %d\n", inputArray[i], countArray[i]);}}system("pause");return 0; }? ?若使用vector類型,可以改為更加實用的例子:比如下面的函數(shù)可以實現(xiàn)統(tǒng)計vector中每個元素出現(xiàn)的次數(shù),且出現(xiàn)次數(shù)不少于minCount的集合
#include <vector> #include<algorithm> #include <iostream> using namespace std; struct Grade {int value;//值int count;//value值出現(xiàn)的次數(shù) };/** @brief 函數(shù)實現(xiàn)統(tǒng)計數(shù)組/vector中每個元素出現(xiàn)的次數(shù),且出現(xiàn)次數(shù)不少于minCount @param inputVector 輸入vector類型的數(shù)據(jù) @param minCount 出現(xiàn)不少于minCount次 @return 返回vector<Grade>類型 */ vector<Grade> countElement(vector<int> inputVector,int minCount) {//int *status =new int[inputVector.size()];vector<int> status;//標(biāo)記狀態(tài):0表示未統(tǒng)計,>1表示已經(jīng)統(tǒng)計了for (int i = 0; i < inputVector.size(); i++) {//status[i] = -1;status.push_back(0);}int v_size = inputVector.size();int value1 = 0, value2 = 0;int count = 0;//計數(shù)vector<Grade> container;//保存結(jié)果Grade perGrade;for (size_t i = 0; i < v_size; i++) {if (status[i] != 0)continue;count = 1;value1 = inputVector.at(i);status[i] = value1;for (size_t j = i + 1; j < v_size; j++) {if (status[j] != 0)continue;value2 = inputVector.at(j);if (value1 == value2){status[j] = value1;count++;}}if (count >= minCount){perGrade.value = value1;perGrade.count = count;container.push_back(perGrade);}}return container; }int main() {int inputArray[13] = {1,1,2,1,3,1,2,2,3,4,9,9,9};vector<int> inputVector(inputArray, inputArray + sizeof(inputArray) / sizeof(int));int minCount = 3;//統(tǒng)計vector中元素出現(xiàn)不少于minCount次數(shù)的元素vector<Grade> container=countElement(inputVector,minCount);system("pause");return 0; }?
數(shù)組與vector互轉(zhuǎn)
? ??利用vector的構(gòu)造函數(shù),可以很方便的將數(shù)組轉(zhuǎn)為vector
int inputArray[12] = {9,1,2,1,3,1,2,2,3,4,9,9};vector<int> inputVector(inputArray, inputArray + sizeof(inputArray) / sizeof(float));? ? 由于vector內(nèi)部的數(shù)據(jù)是存放在連續(xù)的存儲空間,vector轉(zhuǎn)數(shù)組事實上只需要獲取vector中第一個數(shù)據(jù)的地址和數(shù)據(jù)的長度即可。如果僅僅是傳參,無需任何操作,直接傳地址即可,如果要進(jìn)行數(shù)據(jù)復(fù)制,可以借用內(nèi)存拷貝函數(shù)“memcpy”。例如:
int *buffer = new int[inputVector.size()];if (!inputVector.empty()){memcpy(buffer, &inputVector[0], inputVector.size() * sizeof(int));}?參考資料:https://blog.csdn.net/Sagittarius_Warrior/article/details/54089242
openCV與vector互轉(zhuǎn)
? 請參考:https://blog.csdn.net/guyuealian/article/details/80253066
vector自定義排序方式
? ? ?下面的例子可實現(xiàn)vector中按照age的大小排序
#include <vector> #include<algorithm> #include <iostream> using namespace std;struct dataInfo {string name;int age; };//降序 bool descendingOrder(const dataInfo &a, const dataInfo &b) {return a.age > b.age; } //升序 bool ascendingOrder(const dataInfo &a, const dataInfo &b) {return a.age < b.age; }int main() {vector<dataInfo> v;dataInfo data;data.age = 10;data.name = "A";v.push_back(data);data.age = 40;data.name = "B";v.push_back(data);data.age = 20;data.name = "C";v.push_back(data);data.age = 30;data.name = "D";v.push_back(data);sort(v.begin(), v.end(), descendingOrder);system("pause");return 0; }vector自定義查找元素
? ? 下面的方法可以實現(xiàn)vector查找指定元素是否存在
#include <vector> #include<algorithm> #include <iostream> #include <string> using namespace std;struct dataInfo {string name;int age;//dataInfo(string _name, int _age) : name(_name), age(_age) {} }; bool operator == (const dataInfo& a, const dataInfo& b) {return a.age == b.age;}int main() {vector<dataInfo> v;dataInfo data;data.age = 10;data.name = "A";v.push_back(data);data.age = 40;data.name = "B";v.push_back(data);data.age = 20;data.name = "C";v.push_back(data);data.age = 30;data.name = "D";v.push_back(data);data.age = 20;data.name = "E";v.push_back(data);//dataInfo t;t.age = 20;//查找年齡為20vector<dataInfo>::iterator ifind = find(v.begin(), v.end(), t);if (ifind != v.end()){cout << "index=" << ifind- v.begin()<< endl;cout << "data:name="<< ifind->name <<",age="<< ifind->age<<endl;}system("pause");return 0; }? ? ?一種更通用的方法是:下面的程序?qū)崿F(xiàn):
? ? 【1】判斷vector的某一元素是否存在,并返回下標(biāo)
? ? 【2】查找vector中最大,最小值的元素,并返回下標(biāo)
#include <vector> #include<algorithm> #include <iostream> #include <string>using namespace std; struct dataInfo {string name;int age;//dataInfo(string _name, int _age) : name(_name), age(_age) {} };/*******判斷vector的某一元素是否存在,并返回下標(biāo) **********/ bool operator == (const dataInfo& a, const dataInfo& b) {return a.age == b.age; } template<typename _Tp> int find_element_in_vector(const vector<_Tp> v, const _Tp element) {vector<_Tp>::const_iterator it = find(v.begin(), v.end(), element);if (it != v.end()) {return it - v.begin();}else {return -1;} }/*******查找vector中最大,最小值的元素,并返回下標(biāo) **********/ bool cmp(const dataInfo& a, const dataInfo& b) {return a.age< b.age; }void main() {vector<dataInfo> v;dataInfo data;data.age = 10;data.name = "A";v.push_back(data);data.age = 40;data.name = "B";v.push_back(data);data.age = 30;data.name = "C";v.push_back(data);data.age = 30;data.name = "D";v.push_back(data);data.age = 20;data.name = "E";v.push_back(data);/**************************查找指定元素的位置*************************/dataInfo t;t.age = 20;//查找年齡為20 int index = find_element_in_vector(v, t);/**************************查找最大值*************************/dataInfo maxValue;///std::vector<int>::iterator maxIte = max_element(v.begin(), v.end());//若是基本數(shù)據(jù)類型std::vector<dataInfo>::iterator maxIte = max_element(v.begin(), v.end(),cmp);//結(jié)構(gòu)體類型if (maxIte != v.end()){index = maxIte - v.begin();maxValue = *maxIte;}/**************************查找最小值*************************/dataInfo minValue;///std::vector<int>::iterator minIte = min_element(v.begin(), v.end());//若是基本數(shù)據(jù)類型std::vector<dataInfo>::iterator minIte = min_element(v.begin(), v.end(), cmp);//結(jié)構(gòu)體類型if (minIte != v.end()){index = minIte - v.begin();minValue = *minIte;}}C++獲取文件的時間等信息:#include <sys/stat.h>
string filePath = "D:\\SmartAlbum\\image1\\i.jpg";struct stat buf;struct tm* tim;int result = stat(filePath.c_str(), &buf);//顯示文件狀態(tài)信息if (result != 0)perror("顯示文件狀態(tài)信息出錯");else{cout << "文件創(chuàng)建時間:" << ctime(&buf.st_ctime);cout << "訪問日期:" << ctime(&buf.st_atime);//注意這里訪問時間為00:00:00為正常cout << "最后修改日期:" << ctime(&buf.st_mtime);cout << "時間值:" << buf.st_ctime << endl;tim = localtime(&buf.st_ctime);printf("創(chuàng)建時間%d:%d:%d:%d:%d:%d\n",tim->tm_year,tim->tm_mon,tim->tm_yday,tim->tm_hour,tim->tm_min,tim->tm_sec);}JNI C++接口的筆記
Java接口定義:
public static native void transferImage_yuv420_888( byte[] Camera_y, int rowStride_y, int pixStride_y,byte[] Camera_u, int rowStride_u, int pixStride_u,byte[] Camera_v, int rowStride_v, int pixStride_v,int width, int height);JNI對應(yīng)的的C++接口:接口簡單實現(xiàn)Y數(shù)組加100,由于是通過指針直接對原數(shù)組進(jìn)行操作,因此不需要返回結(jié)果
}extern "C" JNIEXPORT void JNICALL Java_com_example_lenovo_transfer_Transfer_transferImage_1yuv420_1888(JNIEnv *env, jclass type,jbyteArray Camera_y_, jint rowStride_y, jint pixStride_y,jbyteArray Camera_u_, jint rowStride_u, jint pixStride_u,jbyteArray Camera_v_, jint rowStride_v, jint pixStride_v,jint width, jint height) {jbyte *Camera_y = env->GetByteArrayElements(Camera_y_, NULL);jbyte *Camera_u = env->GetByteArrayElements(Camera_u_, NULL);jbyte *Camera_v = env->GetByteArrayElements(Camera_v_, NULL);// TODOunsigned char *y = (unsigned char *) Camera_y;unsigned char *u = (unsigned char *) Camera_u;unsigned char *v = (unsigned char *) Camera_v;for (size_t i=0; i < height; i++){for (size_t j=0; j < width; j++) {*y=*y+100;y++;}}env->ReleaseByteArrayElements(Camera_y_, Camera_y, 0);env->ReleaseByteArrayElements(Camera_u_, Camera_u, 0);env->ReleaseByteArrayElements(Camera_v_, Camera_v, 0); }size_t 和 size_type的區(qū)別
?為了使自己的程序有很好的移植性,c++程序員應(yīng)該盡量使用size_t和size_type而不是int, unsigned
- size_t是全局定義的類型;size_type是STL類中定義的類型屬性,用以保存任意string和vector類對象的長度
- ?string::size_type?制類型一般就是unsigned?int,?但是不同機器環(huán)境長度可能不同?win32?和win64上長度差別;size_type一般也是unsigned?int
- 使用的時候可以參考:
?
- size_t?使用的時候頭文件需要?<cstddef>?;size_type?使用的時候需要<string>或者<vector>
? ? ?上述長度均相等,長度為win32:4?win64:8
- 二者聯(lián)系:在用下標(biāo)訪問元素時,vector使用vector::size_type作為下標(biāo)類型,而數(shù)組下標(biāo)的正確類型則是size_t
shared_ptr和make_shared
std::shared_ptr<TNN_NS::TNN> net = std::make_shared<TNN_NS::TNN>();Cmake構(gòu)建項目:
項目結(jié)構(gòu):https://github.com/PanJinquan/opencv-learning-tutorials/tree/master/cmakeDemo
根目錄CmakeLists.txt:
cmake_minimum_required(VERSION 3.5) # 參考資料: # http://www.hahack.com/codes/cmake/ # https://blog.csdn.net/weicao1990/article/details/72844995project(cmakeDemo)# 指定頭文件目錄 include_directories(${PROJECT_SOURCE_DIR}/include)# 指定可執(zhí)行文件的輸出目錄,輸出到bin下面 ? #set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#指定庫文件輸出路徑 ? #set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)# 將myhello子工程加入到主工程,里面必須含有CMakeLists.txt文件 add_subdirectory(myhello)#指定可執(zhí)行文件的輸出目錄,輸出到bin下面 ? set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#指定庫文件輸出路徑 ? set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)set(LIB_MY my_lib)# 在指定目錄下查找?guī)?#xff0c;并保存在LIBPATH變量中: # find_library (<VAR> name1 [path1 path2 ...]) # find_library(LIB_MY my_lib ${PROJECT_SOURCE_DIR}/lib)# 構(gòu)成可執(zhí)行文件 add_executable(Demo main.cpp)# 鏈接的庫文件 # link_libraries( ${LIB_MY})# 添加鏈接庫:將子模myhello鏈接到Demo中 #target_link_libraries (Demo ${LIB_MY_LIB}) target_link_libraries (Demo ${LIB_MY})myhello目錄的CMakeLists.txt文件
cmake_minimum_required(VERSION 3.5) # 常用的變量: # . 表示當(dāng)前目錄 # ${PROJECT_SOURCE_DIR}:工程的根目錄 ?# 指定頭文件目錄,PROJECT_SOURCE_DIR為工程的根目錄 ? include_directories(${PROJECT_SOURCE_DIR}/include)#指定可執(zhí)行文件的輸出目錄,輸出到bin下面 ? set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)#指定庫文件輸出路徑 ? set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)# 將指定的源文件生成鏈接文件myhello # add_library(myhello myhello.cpp) # 更加便捷的方法是使用aux_source_directory(<dir> <variable>) # 查找當(dāng)前目錄下的所有源文件,并將名稱保存到 DIR_SRCS 變量中 aux_source_directory(${PROJECT_SOURCE_DIR}/myhello DIR_SRCS)add_library(my_lib ${DIR_SRCS}) #set_target_properties(my_lib PROPERTIES OUTPUT_NAME "my_lib")?
總結(jié)
以上是生活随笔為你收集整理的C++常用方法笔记资料的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用自己的数据集训练GoogLenet
- 下一篇: OpenCV使用pthread实现多线程