demo.cpp 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633
  1. // demo.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <iostream>
  5. #include <opencv2\highgui\highgui.hpp>
  6. #include <opencv2\imgproc\imgproc.hpp>
  7. #include <opencv2\opencv.hpp>
  8. #include <map>
  9. #include <fstream>
  10. #include <time.h>
  11. #include <iomanip>
  12. #include <fstream>
  13. #include <stdlib.h>
  14. #include "utils.h"
  15. #include "config.h"
  16. #include "data_def.h"
  17. #include "optimal_angle.h"
  18. #include "cut_point_sc.h"
  19. #include "cut_point_rs.h"
  20. #include "cut_point_rs_reid.h"
  21. #include "graft_cv_api.h"
  22. #include "logger.h"
  23. using namespace cv;
  24. using namespace graft_cv;
  25. ofstream logger_ofs;
  26. CGcvLogger g_logger = CGcvLogger(
  27. logger_ofs,
  28. CGcvLogger::file_and_terminal,
  29. CGcvLogger::info,
  30. "D:\\logs\\gcv.log");
  31. void test_init_cp(ConfigParam&cp){
  32. cp.image_show=true;//
  33. cp.image_return=true;//
  34. cp.image_row_grid=20;
  35. cp.image_col_grid=100;
  36. cp.timeout_append=100;
  37. cp.timeout_proc=500;
  38. cp.self_camera=true;
  39. cp.image_save=true;
  40. cp.image_depository="D:\\logs\\img_depo";
  41. cp.image_backup_days=7;
  42. cp.oa_y_flip=true;
  43. cp.oa_morph_radius = 1;
  44. cp.oa_morph_iteration=2;
  45. /*cp.oa_min_hist_value=10;
  46. cp.oa_morph_radius_base = 1;
  47. cp.oa_morph_iteration_base=2;
  48. cp.oa_min_hist_value_base=10;
  49. cp.oa_col_th_ratio=0.7;
  50. cp.oa_row_th_ratio=1.2;
  51. cp.oa_stem_x_padding=100;
  52. cp.oa_stem_dia_min=10;
  53. cp.oa_stem_fork_y_min=10;
  54. cp.oa_stem_dia_mp=0.9;
  55. cp.oa_clip_y_min=245;
  56. cp.oa_clip_y_max = 355;*/
  57. cp.rs_y_flip=false;
  58. cp.rs_col_th_ratio= 0.7;
  59. cp.rs_row_th_ratio= 1.15;
  60. cp.rs_stem_x_padding= 40;
  61. cp.rs_stem_dia_min=12;
  62. cp.rs_stem_fork_y_min=10;
  63. cp.rs_stem_dia_mp=0.98;
  64. cp.rs_stem_edge_detect_window=5;
  65. cp.rs_morph_radius=1;
  66. cp.rs_morph_iteration=2;
  67. cp.rs_morph_iteration_gray=5;
  68. cp.rs_max_corner_num=500;
  69. cp.rs_corner_qaulity_level= 0.1;
  70. cp.rs_corner_min_distance= 10;
  71. cp.rs_cand_corner_box_width_ratio=3.0;
  72. cp.rs_cand_corner_box_xoffset_ratio=0.75;
  73. cp.rs_opt_corner_xoffset_ratio = 0.2;
  74. cp.rs_opt_corner_yoffset_ratio = -0.5;
  75. cp.rs_corner_mask_rad_ratio=0.25;
  76. cp.rs_cut_angle=-45;
  77. cp.sc_y_flip=false;
  78. cp.sc_col_th_ratio=0.7;
  79. cp.sc_row_th_ratio=2.5; //2-3.0
  80. cp.sc_stem_x_padding=50;
  81. cp.sc_stem_dia_min=3;
  82. cp.sc_clip_padding=5;
  83. cp.sc_stem_ymax_padding=50;
  84. cp.sc_default_cut_length=20;
  85. cp.sc_stem_edge_detect_window=5;
  86. cp.sc_r2_th=1.05;
  87. cp.sc_r2_window=10;
  88. cp.sc_average_window=10;
  89. cp.sc_morph_radius=1;
  90. cp.sc_morph_iteration=2;
  91. cp.rs_oa_pixel_ratio=1.0;
  92. cp.rs_cut_pixel_ratio=1.0;
  93. cp.sc_cut_pixel_ratio=1.0;
  94. }
  95. void test_imginfo2mat()
  96. {
  97. int t=0;
  98. ImgInfo* ii = new ImgInfo();
  99. ii->angle=0;
  100. ii->width = ii->height = 13;
  101. ii->data = new graft_cv::byte[ii->width*ii->height];
  102. for (int i=0;i<ii->height;++i){
  103. for (int j=0;j<ii->width;++j){
  104. if (i==j || i+j==ii->width-1){
  105. ii->data[i*ii->width+j]=255;
  106. }
  107. else{
  108. ii->data[i*ii->width+j]=0;
  109. }
  110. }
  111. }
  112. Mat img = imginfo2mat(ii);
  113. /*namedWindow("3_3", 0);
  114. imshow("3_3", img);
  115. waitKey(1);
  116. destroyAllWindows();*/
  117. delete [] ii->data;
  118. delete ii;
  119. };
  120. void test_camconfig_write()
  121. {
  122. ConfigParam cp0, cp1;
  123. memset(&cp1, 0, sizeof(ConfigParam));
  124. cp0 = cp1;
  125. CGCvConfig cam0 = CGCvConfig();
  126. CGCvConfig cam1 = CGCvConfig();
  127. cam0.setConfParam(&cp0);
  128. cam1.setConfParam(&cp1);
  129. FileStorage fs("cam_config.yml", FileStorage::WRITE);
  130. fs<<"conf_parameters";
  131. fs<<cam0;
  132. //fs<<cam1;
  133. //fs<<"]";
  134. fs.release();
  135. };
  136. void test_camconfig_read()
  137. {
  138. ConfigParam cp0, cp1;
  139. memset(&cp1, 0, sizeof(ConfigParam));
  140. cp0 = cp1;
  141. //cp0.oa_min_hist_value = 100;
  142. cout<<&cp0<<endl;
  143. CGCvConfig cam0 = CGCvConfig();
  144. //CGCvConfig cam1 = CGCvConfig();
  145. cam0.setConfParam(&cp0);
  146. //cam1.setConfParam(cp1);
  147. FileStorage fs("cam_config.yml", FileStorage::READ);
  148. cam0.read(fs["conf_parameters"]);
  149. //fs<<cam1;
  150. //fs<<"]";
  151. fs.release();
  152. };
  153. void test_anglefit_readdata(vector<map<int,int>>& data){
  154. string ifile = "E:\\projects\\grafting_robots\\py_code\\test.txt";
  155. ifstream ifs(ifile.c_str(), ifstream::in );
  156. data.clear();
  157. if( ifs.is_open()){
  158. string line;
  159. map<int,int> tmp;
  160. while(getline(ifs,line)){
  161. std::cout<<line<<std::endl;
  162. size_t found = line.find(",");
  163. if(found !=string::npos){
  164. //found
  165. string sub0 = line.substr(0,found);
  166. string sub1 = line.substr(found+1);
  167. int an = int(stod(sub0));
  168. int wi = stoi(sub1);
  169. if(an==0){
  170. tmp.clear();
  171. }
  172. tmp.insert(make_pair<int,int>(an,wi));
  173. if(an==180){
  174. data.push_back(tmp);
  175. }
  176. }
  177. }
  178. ifs.close();
  179. }
  180. };
  181. //void test_anglefit()
  182. //{
  183. // ConfigParam cp;
  184. // COptimalAnglePart opa = COptimalAnglePart(cp);
  185. // vector<map<int,int>> data;
  186. // //test_anglefit_readdata(data);
  187. // map<int,int>tmp;
  188. // /*tmp.insert(make_pair<int,int>(0,216));
  189. // tmp.insert(make_pair<int,int>(30,189));
  190. // tmp.insert(make_pair<int,int>(60,112));
  191. // tmp.insert(make_pair<int,int>(90,151));
  192. // tmp.insert(make_pair<int,int>(120,188));*/
  193. //
  194. // tmp.insert(make_pair<int,int>(0,315));
  195. // tmp.insert(make_pair<int,int>(30,270));
  196. // tmp.insert(make_pair<int,int>(60,218));
  197. // tmp.insert(make_pair<int,int>(90,141));
  198. // tmp.insert(make_pair<int,int>(120,127));
  199. //
  200. // data.push_back(tmp);
  201. // for(vector<map<int,int>>::iterator it = data.begin(); it!=data.end(); ++it){
  202. //
  203. // map<int,int>& an2width = *it;
  204. // double oa = opa.angle_fit(an2width);
  205. // cout<<oa<<endl;
  206. // }
  207. //
  208. //};
  209. //void test_optimal_angle(){
  210. // //string folder = "E:\\projects\\grafting_robots\\py_code\\tmp";
  211. // string folder = "D:\\grafting_robot\\samples\\tmp";
  212. // namedWindow("pic", 0);
  213. // vector<cv::String>filenames;
  214. // ConfigParam cp;
  215. // test_init_cp(cp);
  216. // /*cp.oa_min_hist_value=10;
  217. // cp.oa_morph_iteration=2;
  218. // cp.oa_morph_radius = 1;*/
  219. // COptimalAngle opa(cp);
  220. //
  221. //
  222. // for(int i = 1;i<=5;++i){
  223. // for(int j = 0;j<=1;++j){
  224. // ostringstream ostr;
  225. // ostr<<i<<j;
  226. // string subfold = ostr.str();
  227. // string src_folder = folder+"\\p"+subfold;
  228. //
  229. // cv::glob(src_folder, filenames);
  230. // opa.reset();
  231. //
  232. // PositionInfo posinfo;
  233. //
  234. // clock_t t,t0;
  235. // t = clock();
  236. // for(size_t idx=0; idx<filenames.size();++idx){
  237. // //cout<<filenames[idx]<<endl;
  238. // size_t found0 = filenames[idx].rfind("\\");
  239. // size_t found1 = filenames[idx].rfind(".");
  240. // int an = stoi(filenames[idx].substr(found0+1, found1-found0))*20;
  241. // if(an >=200){
  242. // an-=200;
  243. // }
  244. //
  245. // Mat img = imread(filenames[idx], cv::IMREAD_GRAYSCALE);
  246. // ImgInfo* imginfo = mat2imginfo(img);
  247. // imginfo->angle = an;
  248. // int obj_width=0;
  249. // try{
  250. // t0 = clock();
  251. // obj_width = opa.append(imginfo,posinfo);
  252. // t0 = clock() - t0;
  253. //
  254. // imginfo_release(&imginfo);
  255. // }
  256. // catch(int i)
  257. // {
  258. // cout<<"i= "<<i<<"异常了"<<endl;
  259. // continue;
  260. // }
  261. // catch(string& msg){
  262. // cout<<"error: "<<msg<<endl;
  263. // continue;
  264. // }
  265. // catch(...)
  266. // {
  267. // continue;
  268. // }
  269. //
  270. //
  271. //
  272. //
  273. // //imshow("pic", img);
  274. // //waitKey(1);
  275. //
  276. // cout<<"angle="<<an<<" rootstock_width="<<obj_width<<" time(seconds): "<<((float)t0)/CLOCKS_PER_SEC<<endl;
  277. //
  278. // }
  279. // double oa = opa.infer(posinfo);
  280. // t = clock() - t;
  281. // cout<<"optimal angle: "<<oa<<endl;
  282. // cout<<"time(seconds): "<<((float)t)/CLOCKS_PER_SEC<<endl;
  283. //
  284. // cout<<"\n\n";
  285. //
  286. //
  287. // }
  288. // }
  289. // destroyAllWindows();
  290. //};
  291. //void test_optimal_angle_simulate(){
  292. //
  293. //
  294. // //string folder = "E:\\projects\\grafting_robots\\py_code\\tmp";
  295. // string folder = "D:\\grafting_robot\\samples\\tmp";
  296. // //string folder = "D:\\grafting_robot\\samples\\rootstock_rotate_part";
  297. // //string folder = "D:\\private\\grafting_robot\\samples\\rootstock_rotate_part";
  298. // //string folder = "D:\\private\\grafting_robot\\samples\\20211215\\rotate";
  299. // namedWindow("pic", CV_WINDOW_NORMAL);
  300. // vector<cv::String>filenames;
  301. // ConfigParam cp;
  302. // test_init_cp(cp);
  303. // cp.image_return=true;
  304. // cp.image_show=true;
  305. // cp.oa_y_flip=false;
  306. // cp.oa_clip_y_min=750;
  307. //
  308. // COptimalAnglePart opa(cp,&g_logger);
  309. //
  310. //
  311. // for(int i = 1;i<=1;++i){
  312. // //for(int j = 0;j<=1;++j){
  313. // ostringstream ostr;
  314. // ostr<<i;
  315. // string subfold = ostr.str();
  316. // string src_folder = folder+"\\"+subfold;
  317. //
  318. // cv::glob(src_folder, filenames);
  319. // opa.reset();
  320. //
  321. // PositionInfo posinfo;
  322. //
  323. // clock_t t,t0;
  324. // t = clock();
  325. // for(size_t idx=0; idx<filenames.size();++idx){
  326. // //cout<<filenames[idx]<<endl;
  327. // size_t found0 = filenames[idx].rfind("\\");
  328. // size_t found1 = filenames[idx].rfind(".");
  329. // int an = stoi(filenames[idx].substr(found0+1, found1-found0));
  330. // if(an >=200){
  331. // an-=200;
  332. // }
  333. //
  334. // Mat img = imread(filenames[idx], cv::IMREAD_GRAYSCALE);
  335. // //Rect rect(Point(0,0),Point(img_.cols,cp.oa_clip_y_min));
  336. // //Mat img = img_(rect);
  337. //
  338. // ImgInfo* imginfo = mat2imginfo(img);
  339. // imginfo->angle = an;
  340. // int obj_width=0;
  341. // try{
  342. // memset(&posinfo,0,sizeof(PositionInfo));
  343. // t0 = clock();
  344. // obj_width = opa.append(imginfo,posinfo);
  345. // t0 = clock() - t0;
  346. //
  347. // imginfo_release(&imginfo);
  348. // }
  349. // catch(int i)
  350. // {
  351. // cout<<"i= "<<i<<"异常了"<<endl;
  352. // continue;
  353. // }
  354. // catch(string& msg){
  355. // cout<<"error: "<<msg<<endl;
  356. // continue;
  357. // }
  358. // catch(...)
  359. // {
  360. // continue;
  361. // }
  362. //
  363. //
  364. // //show return images
  365. // for (int i =0;i<5;++i){
  366. // if (!posinfo.pp_images[i]){continue;}
  367. // Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  368. // imshow("pic", tmp_img);
  369. // waitKey(-1);
  370. // }
  371. //
  372. //
  373. //
  374. // cout<<"angle="<<an<<" rootstock_width="<<obj_width<<" time(seconds): "<<((float)t0)/CLOCKS_PER_SEC<<endl;
  375. //
  376. // }
  377. // try{
  378. // double oa = opa.infer(posinfo);
  379. // t = clock() - t;
  380. // cout<<"optimal angle: "<<oa<<endl;
  381. // cout<<"time(seconds): "<<((float)t)/CLOCKS_PER_SEC<<endl;
  382. //
  383. // cout<<"\n\n";
  384. // }
  385. // catch(string& msg){
  386. // cout<<"error: "<<msg<<endl;
  387. // continue;
  388. // }
  389. // catch(...)
  390. // {
  391. // continue;
  392. // }
  393. //
  394. //
  395. // //}
  396. // }
  397. // destroyAllWindows();
  398. //};
  399. //void test_optimal_angle_part(){
  400. // /*
  401. // string data_file = "D:\\private\\grafting_robot\\py_code\\test.txt";
  402. // ifstream ifs;
  403. // ifs.open(data_file, fstream::out);
  404. // std::vector<std::map<int,int>>data;
  405. // std::vector<string> answer;
  406. // if(ifs.is_open()){
  407. // string line;
  408. // std::map<int,int>tmp;
  409. // while(!ifs.eof()){
  410. // getline(ifs, line);
  411. // //cout<<line<<endl;
  412. // size_t ptmp = line.find("tmp");
  413. // if(ptmp!=string::npos){
  414. // tmp.clear();
  415. // }
  416. // else{
  417. // size_t pos = line.find(",");
  418. // if(pos==string::npos){
  419. // data.push_back(tmp);
  420. // tmp.clear();
  421. // answer.push_back(line);
  422. // }
  423. // else{
  424. // string ang = line.substr(0,pos);
  425. // int an = atoi(ang.c_str());
  426. // string wid = line.substr(pos+1,string::npos);
  427. // int wi = atoi(wid.c_str());
  428. // //cout<<ang<<" "<<wid<<endl;
  429. // tmp.insert(make_pair<int,int>(an,wi));
  430. // }
  431. // }
  432. // }
  433. // ifs.close();
  434. // }
  435. //
  436. //
  437. //
  438. // //calculate
  439. // ConfigParam cp;
  440. // test_init_cp(cp);
  441. // cp.image_return=true;
  442. // cp.image_show=true;
  443. //
  444. // COptimalAnglePart opa(cp);
  445. // for(size_t i=0;i< data.size();++i){
  446. // cout<<"optimal angle: "<<answer[i]<<endl;
  447. // for(size_t j=0;j<5;++j){
  448. // int start_angle = j*20;
  449. // std::map<int,int> impl_data;
  450. // int impl_an = start_angle;
  451. // if (impl_an==80 && data[i][impl_an]==277)
  452. // {
  453. // cout<<"debug"<<endl;
  454. // }
  455. // while(true){
  456. // if((impl_an-start_angle)>110){break;}
  457. // if(impl_an>180){break;}
  458. // impl_data.insert(make_pair<int,int>(impl_an,data[i][impl_an]));
  459. // cout<<impl_an<<"\t"<<data[i][impl_an]<<endl;
  460. // impl_an+=20;
  461. // }
  462. //
  463. // double a = opa.angle_fit(impl_data);
  464. // cout<<"angle: "<<a<<"\n"<<endl;
  465. // }
  466. //
  467. // }*/
  468. //
  469. // ConfigParam cp;
  470. // test_init_cp(cp);
  471. // cp.image_return=true;
  472. // cp.image_show=true;
  473. //
  474. // COptimalAnglePart* opa=new COptimalAnglePart(cp);
  475. // map<int,int> d;
  476. // d.insert(make_pair<int,int>(0,167));
  477. // d.insert(make_pair<int,int>(30,126));
  478. // d.insert(make_pair<int,int>(60,202));
  479. // d.insert(make_pair<int,int>(90,193));
  480. // d.insert(make_pair<int,int>(120,121));
  481. // double a = opa->angle_fit(d);
  482. // cout<<"angle: "<<a<<"\n"<<endl;
  483. //};
  484. void test_sc_cut_point()
  485. {
  486. //string src_folder = "E:\\projects\\grafting_robots\\samples\\scion1_part";
  487. //string src_folder = "D:\\private\\grafting_robot\\samples\\scion1_part";
  488. string src_folder = "D:\\grafting_robot\\samples\\scion1_part";
  489. vector<cv::String>filenames;
  490. cv::glob(src_folder, filenames);
  491. ConfigParam cp;
  492. test_init_cp(cp);
  493. /*
  494. //cp.sc_col_th_ratio=0.7;// = 0.7, scion binary image column histogram, threshold ratio for max-value, for
  495. // // detect stem x-range
  496. // cp.sc_row_th_ratio=1.2; // = 1.2, row histogram of stem x-range subimage, stem diameter ratio for detect
  497. // // stem fork position
  498. // cp.sc_stem_x_padding=50; // = 50;
  499. // cp.sc_stem_dia_min=20; //=20,
  500. // cp.sc_stem_dia_max=60; //=60,
  501. // cp.sc_stem_fork_y_min=80;//=80, cut slop length, jump this range for seaching stem fork position
  502. // cp.sc_fork_down=10; // stem fork down X pixels, below this line to calculate r2 ratio
  503. // cp.sc_r2_th=1.05; //threshold for r2 ratio
  504. // cp.sc_r2_window=5; //= 5; the radius for calculate r2 index
  505. // cp.sc_average_window=10;// =10;
  506. //cp.sc_morph_radius=1;//scion, open-operation morph-size, = 1;-->COptimalAngle::imgproc(Mat& img)
  507. // cp.sc_morph_iteration=2; //
  508. //
  509. */
  510. PositionInfo posinfo;
  511. CScionCutPoint scp(cp);
  512. //namedWindow("pic", WINDOW_NORMAL);
  513. ofstream g_logger_ofs;
  514. CGcvLogger g_logger = CGcvLogger(
  515. g_logger_ofs,
  516. CGcvLogger::file_and_terminal,
  517. CGcvLogger::warning,
  518. "./gcv_debug.log");
  519. clock_t t;
  520. for(size_t idx=0; idx<filenames.size();++idx){
  521. //cout<<idx<<"\t"<<filenames[idx]<<endl;
  522. //if(idx<38){continue;}
  523. //string fn = "D:\\private\\grafting_robot\\samples\\scion1_part\\IMG_20210830_153852.jpg";
  524. //Mat img_src = imread(fn, cv::IMREAD_COLOR);
  525. Mat img_src = imread(filenames[idx], cv::IMREAD_COLOR);
  526. Mat img;
  527. resize(img_src,img,Size(img_src.cols/4, img_src.rows/4));
  528. //ImgInfo* imginfo = mat2imginfo(img);
  529. int fold_y = 0;
  530. try{
  531. t = clock();
  532. fold_y = scp.up_point_detect(0,img,posinfo);
  533. t = clock() - t;
  534. }
  535. catch(exception &err){
  536. cout<<err.what()<<endl;
  537. }
  538. catch(const char* msg){
  539. cout<<msg<<endl;
  540. g_logger.ERRORINFO(msg);
  541. g_logger.INFO(filenames[idx]);
  542. }
  543. catch(string msg){
  544. cout<<msg<<endl;
  545. g_logger.ERRORINFO(msg);
  546. g_logger.INFO(filenames[idx]);
  547. }
  548. catch(...){
  549. cout<<"============================================unknown error"<<endl;
  550. cout<<filenames[idx]<<endl<<endl;
  551. }
  552. //cv::line(img,Point(0,fold_y), Point(img.cols,fold_y),Scalar(0,0,255));
  553. //imshow("pic", img);
  554. //waitKey(-1);
  555. cout<<"time(seconds): "<<((float)t)/CLOCKS_PER_SEC<<endl;
  556. cout<<"\n";
  557. }
  558. };
  559. void test_sc_cut_point_simulate()
  560. {
  561. //string src_folder = "E:\\projects\\grafting_robots\\samples\\scion1_part";
  562. //string src_folder = "D:\\private\\grafting_robot\\samples\\scion1_part";
  563. //string src_folder = "D:\\grafting_robot\\samples\\scion1_simulate";
  564. string src_folder = "D:\\private\\grafting_robot\\samples\\20211222\\scion";
  565. vector<cv::String>filenames;
  566. cv::glob(src_folder, filenames);
  567. ConfigParam cp;
  568. test_init_cp(cp);
  569. cp.image_return=true;
  570. cp.image_show=true;
  571. cp.rs_y_flip=false;
  572. cp.self_camera=false;
  573. PositionInfo posinfo;
  574. memset(&posinfo,0,sizeof(PositionInfo));
  575. CScionCutPoint scp(cp,&g_logger);
  576. //namedWindow("pic", WINDOW_NORMAL);
  577. /*ofstream g_logger_ofs;
  578. Logger g_logger = Logger(
  579. g_logger_ofs,
  580. Logger::file_and_terminal,
  581. Logger::warning,
  582. "./gcv_debug.log");*/
  583. clock_t t;
  584. for(size_t idx=0; idx<filenames.size();++idx){
  585. //cout<<idx<<"\t"<<filenames[idx]<<endl;
  586. //if(idx<38){continue;}
  587. //string fn = "D:\\private\\grafting_robot\\samples\\scion1_part\\IMG_20210830_153852.jpg";
  588. //Mat img_src = imread(fn, cv::IMREAD_COLOR);
  589. cout<<idx<<"\t"<<filenames[idx]<<endl;
  590. //if(filenames[idx].find("0-4-504")==string::npos){continue;}
  591. Mat img = imread(filenames[idx], cv::IMREAD_COLOR);
  592. int fold_y = 0;
  593. try{
  594. t = clock();
  595. fold_y = scp.up_point_detect(0,img,posinfo);
  596. t = clock() - t;
  597. }
  598. catch(exception &err){
  599. cout<<err.what()<<endl;
  600. }
  601. catch(const char* msg){
  602. cout<<msg<<endl;
  603. g_logger.ERRORINFO(msg);
  604. g_logger.INFO(filenames[idx]);
  605. }
  606. catch(string msg){
  607. cout<<msg<<endl;
  608. g_logger.ERRORINFO(msg);
  609. g_logger.INFO(filenames[idx]);
  610. }
  611. catch(...){
  612. cout<<"============================================unknown error"<<endl;
  613. cout<<filenames[idx]<<endl<<endl;
  614. }
  615. //show return images
  616. for (int i =0;i<5;++i){
  617. if (!posinfo.pp_images[i]){continue;}
  618. Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  619. imshow("pic", tmp_img);
  620. waitKey(-1);
  621. }
  622. //cv::line(img,Point(0,fold_y), Point(img.cols,fold_y),Scalar(0,0,255));
  623. //imshow("pic", img);
  624. //waitKey(-1);
  625. cout<<"time(seconds): "<<((float)t)/CLOCKS_PER_SEC<<endl;
  626. cout<<"\n";
  627. }
  628. };
  629. //void test_rs_cut_point(){
  630. // ConfigParam cp;
  631. // test_init_cp(cp);
  632. //
  633. // namedWindow("pic", CV_WINDOW_NORMAL);
  634. // CRootStockCutPoint rscp(cp);
  635. // ofstream g_logger_ofs;
  636. // CGcvLogger g_logger = CGcvLogger(
  637. // g_logger_ofs,
  638. // CGcvLogger::file_and_terminal,
  639. // CGcvLogger::warning,
  640. // "./gcv_debug.log");
  641. // clock_t t;
  642. // for(int i=4;i<193;++i){
  643. // //if (/*i !=11 &&*/ D:\private\grafting_robot\samples\rs_cut_simulate
  644. // // i !=32 &&
  645. // // i !=48 &&
  646. // // i != 49 &&
  647. // // i != 53 &&
  648. // // i != 103 &&
  649. // // i != 104 &&
  650. // // i != 106 &&
  651. // // i != 110 &&
  652. // // i != 125 &&
  653. // // i !=182 &&
  654. // // i != 187 &&
  655. // // i != 191)
  656. // //{
  657. // // continue;
  658. // //}
  659. //
  660. // stringstream buff;
  661. // buff<<setw(3) << setfill('0') << i;
  662. // cout<<buff.str()<<endl;
  663. //
  664. // //string img_file= "E:/projects/grafting_robots/samples/rootstlock_pumpkin/"+buff.str()+"/6.jpg";
  665. // //string img_file= "D:/private/grafting_robot/samples/rootstlock_pumpkin/"+buff.str()+"/6.jpg";
  666. // string img_file= "D:/grafting_robot/samples/rootstlock_pumpkin/"+buff.str()+"/6.jpg";
  667. //
  668. //
  669. // Mat img = imread(img_file,CV_LOAD_IMAGE_COLOR );
  670. // //ImgInfo* imginfo = mat2imginfo(img);
  671. // PositionInfo pinfo;
  672. // try{
  673. // t = clock();
  674. // int fold_y = rscp.up_point_detect(0,img, pinfo);
  675. // t = clock() - t;
  676. // }
  677. // catch(exception &err){
  678. // cout<<err.what()<<endl;
  679. // }
  680. // catch(string msg){
  681. // cout<<msg<<endl;
  682. // cout<<img_file<<endl<<endl;
  683. // g_logger.ERRORINFO(msg);
  684. // g_logger.INFO(buff.str());
  685. // }
  686. // catch(...){
  687. // cout<<"============================================unknown error"<<endl;
  688. // cout<<img_file<<endl<<endl;
  689. // }
  690. // //cv::line(img,Point(0,fold_y), Point(img.cols,fold_y),Scalar(0,0,255));
  691. //
  692. // imshow("pic", img);
  693. // waitKey(1);
  694. //
  695. // cout<<"time(seconds): "<<((float)t)/CLOCKS_PER_SEC<<endl;
  696. //
  697. // cout<<"\n\n";
  698. //
  699. // }
  700. //
  701. //
  702. //};
  703. //void test_rs_cut_point_simulate(){
  704. // ConfigParam cp;
  705. // test_init_cp(cp);
  706. // cp.image_show=true;
  707. // cp.image_return = true;
  708. //
  709. // namedWindow("pic", CV_WINDOW_NORMAL);
  710. // CRootStockCutPoint rscp(cp,&g_logger);
  711. // /*ofstream g_logger_ofs;
  712. // Logger g_logger = Logger(
  713. // g_logger_ofs,
  714. // Logger::file_and_terminal,
  715. // Logger::warning,
  716. // "./gcv_debug.log");*/
  717. //
  718. // //string src_folder = "D:\\private\\grafting_robot\\samples\\rs_cut_simulate";
  719. // //string src_folder = "D:\\private\\grafting_robot\\samples\\rootstock_hold_down";
  720. // //string src_folder = "D:\\grafting_robot\\samples\\rootstock_hold_down";
  721. // string src_folder = "D:\\private\\grafting_robot\\samples\\20211215\\rootstock";
  722. // vector<cv::String>filenames;
  723. // cv::glob(src_folder, filenames);
  724. //
  725. // clock_t t;
  726. // for(int i=0;i<filenames.size();++i){
  727. //
  728. // string img_file= filenames[i];
  729. //
  730. // Mat img = imread(img_file,CV_LOAD_IMAGE_COLOR );
  731. // //ImgInfo* imginfo = mat2imginfo(img);
  732. // PositionInfo pinfo;
  733. // memset(&pinfo,0,sizeof(PositionInfo));
  734. // try{
  735. // t = clock();
  736. // int fold_y = rscp.up_point_detect(0,img, pinfo);
  737. // t = clock() - t;
  738. // }
  739. // catch(exception &err){
  740. // cout<<err.what()<<endl;
  741. // }
  742. // catch(string msg){
  743. // cout<<msg<<endl;
  744. // cout<<img_file<<endl<<endl;
  745. // g_logger.ERRORINFO(msg);
  746. // g_logger.INFO(img_file);
  747. // }
  748. // catch(...){
  749. // cout<<"============================================unknown error"<<endl;
  750. // cout<<img_file<<endl<<endl;
  751. // }
  752. // //cv::line(img,Point(0,fold_y), Point(img.cols,fold_y),Scalar(0,0,255));
  753. //
  754. // imshow("pic", img);
  755. // waitKey(1);
  756. //
  757. // //show return images
  758. // for (int i =0;i<5;++i){
  759. // if (!pinfo.pp_images[i]){continue;}
  760. // Mat tmp_img = imginfo2mat(pinfo.pp_images[i]);
  761. // imshow("pic", tmp_img);
  762. // waitKey(-1);
  763. // }
  764. // cout<<"time(seconds): "<<((float)t)/CLOCKS_PER_SEC<<endl;
  765. //
  766. // cout<<"\n\n";
  767. //
  768. // }
  769. //
  770. //
  771. //};
  772. //void test_rs_cp_reid()
  773. //{
  774. // ConfigParam cp;
  775. // test_init_cp(cp);
  776. // cp.image_show=false;
  777. // cp.image_return = true;
  778. // cp.self_camera=false;
  779. // cp.oa_y_flip=false;
  780. //
  781. // namedWindow("pic", CV_WINDOW_NORMAL);
  782. // CRootStockCutPoint rscp(cp,&g_logger);
  783. //
  784. // //string src_folder = "D:\\private\\grafting_robot\\samples\\rs_cut_simulate";
  785. // //string src_folder = "D:\\private\\grafting_robot\\samples\\rootstock_hold_down";
  786. // //string src_folder = "D:\\grafting_robot\\samples\\rootstock_hold_down";
  787. // string src_folder = "D:\\private\\grafting_robot\\samples\\20211215\\reid";
  788. // vector<cv::String>filenames;
  789. // cv::glob(src_folder, filenames);
  790. //
  791. // clock_t t;
  792. // for(int i=0;i<filenames.size();++i){
  793. //
  794. // string img_file= filenames[i];
  795. //
  796. // Mat img = imread(img_file,CV_LOAD_IMAGE_COLOR);
  797. // //img = img(Rect(0,0,img.cols,(int)(img.rows/2)));
  798. // imshow("pic", img);
  799. // waitKey(-1);
  800. //
  801. // //ImgInfo* imginfo = mat2imginfo(img);
  802. // PositionInfo pinfo;
  803. // memset(&pinfo,0,sizeof(PositionInfo));
  804. // try{
  805. // t = clock();
  806. // int fold_y = rscp.up_point_reid(0,img,100.0, pinfo);
  807. // t = clock() - t;
  808. // }
  809. // catch(exception &err){
  810. // cout<<err.what()<<endl;
  811. // }
  812. // catch(string msg){
  813. // cout<<msg<<endl;
  814. // cout<<img_file<<endl<<endl;
  815. // g_logger.ERRORINFO(msg);
  816. // g_logger.INFO(img_file);
  817. // }
  818. // catch(...){
  819. // cout<<"============================================unknown error"<<endl;
  820. // cout<<img_file<<endl<<endl;
  821. // }
  822. // //cv::line(img,Point(0,fold_y), Point(img.cols,fold_y),Scalar(0,0,255));
  823. //
  824. // imshow("pic", img);
  825. // waitKey(1);
  826. //
  827. // //show return images
  828. // for (int i =0;i<5;++i){
  829. // if (!pinfo.pp_images[i]){continue;}
  830. // Mat tmp_img = imginfo2mat(pinfo.pp_images[i]);
  831. // imshow("pic", tmp_img);
  832. // waitKey(-1);
  833. // }
  834. // cout<<"time(seconds): "<<((float)t)/CLOCKS_PER_SEC<<endl;
  835. //
  836. // cout<<"\n\n";
  837. //
  838. // }
  839. //}
  840. void test_api_scion(){
  841. // 0 ConfigParam cp;
  842. ConfigParam cp;
  843. //0
  844. //char* lpath="D:\\grafting_robot\\cpp_code\\logs\\gcv.log";
  845. //char* lpath = "D:\\private\\grafting_robot\\logs\\gcv.log";
  846. //cv_set_logpath(lpath);
  847. //cv_set_loglevel(0);
  848. //cout<<"test"<<endl;
  849. // 1 get version
  850. //test_init_cp(cp);
  851. char* ver = new char[10];
  852. get_version(ver);
  853. cout<<ver<<endl;
  854. delete [] ver;
  855. ver=0;
  856. //2 cv_set_param
  857. //cp.image_show=false;
  858. //cv_set_param(cp);
  859. //cv_save_param(0);
  860. //3 set log
  861. //cv_set_logpath("D:\\logs");
  862. //cv_set_loglevel(0);
  863. //3 cv_get_param();
  864. //ConfigParam cp_tmp;
  865. //cv_get_param(cp_tmp);
  866. //4 void cv_get_conf_file
  867. //char* conf_file_ret = new char[128];
  868. //cv_get_conf_file(conf_file_ret);
  869. //cout<<conf_file_ret<<endl;
  870. //delete [] conf_file_ret;
  871. //conf_file_ret=0;
  872. //5 cv_init()
  873. //char *conf_file = "D:\\private\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  874. //char *conf_file = "D:\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  875. char *conf_file = "E:\\projects\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  876. int rst = cv_init(conf_file);
  877. ConfigParam cp_ret;
  878. cv_get_param(cp_ret);
  879. cv_set_loglevel(0);
  880. cv_init_image_saver();
  881. //return;
  882. //
  883. //string work_folder = "D:\\private\\grafting_robot\\samples\\20211215\\scion";
  884. string work_folder = "E:\\projects\\grafting_robot\\samples\\20220115\\scion";
  885. vector<cv::String>filenames;
  886. cv::glob(work_folder, filenames);
  887. for(size_t i=0;i<filenames.size();++i){
  888. string fname = filenames[i];
  889. PositionInfo posinfo;
  890. Mat img = imread(fname, cv::IMREAD_GRAYSCALE);
  891. if(img.empty()){continue;}
  892. image_set_top(img,20,8);
  893. ImgInfo* imginfo = mat2imginfo(img);
  894. int rst = sc_cut_point(imginfo,posinfo);
  895. for (int i =0;i<5;++i){
  896. if (!posinfo.pp_images[i]){continue;}
  897. Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  898. imshow("pic", tmp_img);
  899. waitKey(-1);
  900. }
  901. }
  902. cv_release();
  903. }
  904. void test_sc_batch(){
  905. // 0 version;
  906. char* ver = new char[10];
  907. get_version(ver);
  908. cout<<ver<<endl;
  909. delete [] ver;
  910. ver=0;
  911. //2 cv_init()
  912. //char *conf_file = "D:\\private\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  913. //char *conf_file = "D:\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  914. char *conf_file = "E:\\projects\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  915. int rst = cv_init(conf_file);
  916. ConfigParam cp_ret;
  917. cv_get_param(cp_ret);
  918. cv_set_loglevel(0);
  919. cv_init_image_saver();
  920. //cp_ret.image_show = true;
  921. //cv_set_param(cp_ret);
  922. //namedWindow("pic", CV_WINDOW_NORMAL);
  923. string work_folder = "E:\\projects\\grafting_robot\\samples\\20220223\\scion";
  924. //string work_folder = "D:\\private\\grafting_robot\\samples\\20220220\\scion";
  925. vector<cv::String>filenames;
  926. cv::glob(work_folder, filenames);
  927. for(size_t idx=0; idx<filenames.size();++idx){
  928. /*stringstream buff;
  929. buff<<work_folder<<"\\"<<i;
  930. string batch_folder = buff.str();*/
  931. PositionInfo posinfo;
  932. string filename = filenames[idx];
  933. if(filename.find("rst_")!=string::npos){
  934. continue;
  935. }
  936. cout<<idx<<"\t"<<filename<<endl;
  937. Mat img = imread(filename, cv::IMREAD_GRAYSCALE);
  938. if(img.empty()){continue;}
  939. image_set_top(img,20,8);
  940. ImgInfo* imginfo = mat2imginfo(img);
  941. try{
  942. //if(filename.find("1947_3.jpg")!=string::npos){
  943. // int ooo=0;
  944. // /*cp_ret.image_show=true;
  945. // cv_set_param(cp_ret);*/
  946. //}
  947. //else{
  948. // continue;
  949. //}
  950. int rst = sc_cut_point(imginfo, posinfo);
  951. imginfo_release(&imginfo);
  952. if(rst){
  953. cout<<"error"<<endl;
  954. continue;
  955. }
  956. for (int i =0;i<5;++i){
  957. if (!posinfo.pp_images[i]){continue;}
  958. Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  959. /*imshow("pic", tmp_img);
  960. waitKey(-1);*/
  961. stringstream bbu;
  962. bbu<<filename<<".rst_"<<i<<".jpg";
  963. string fnn = bbu.str();
  964. cv::imwrite(fnn,tmp_img);
  965. }
  966. }
  967. catch(...){
  968. std::cout<<"some error ..."<<endl;
  969. }
  970. }
  971. cv_release();
  972. }
  973. void test_rs_batch(){
  974. // 0 version;
  975. char* ver = new char[10];
  976. get_version(ver);
  977. cout<<ver<<endl;
  978. delete [] ver;
  979. ver=0;
  980. //2 cv_init()
  981. //char *conf_file = "D:\\private\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  982. //char *conf_file = "D:\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  983. char *conf_file = "E:\\projects\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  984. int rst = cv_init(conf_file);
  985. ConfigParam cp_ret;
  986. cv_get_param(cp_ret);
  987. cv_set_loglevel(0);
  988. cv_init_image_saver();
  989. //cp_ret.image_show = true;
  990. //cv_set_param(cp_ret);
  991. //namedWindow("pic", CV_WINDOW_NORMAL);
  992. string work_folder = "E:\\projects\\grafting_robot\\samples\\20220620\\rootstock";
  993. //string work_folder = "D:\\private\\grafting_robot\\samples\\20220220\\rootstock";
  994. vector<cv::String>filenames;
  995. cv::glob(work_folder, filenames);
  996. int cnter=0;
  997. for(size_t idx=0; idx<filenames.size();++idx){
  998. string rs_filename = filenames[idx];
  999. if(rs_filename.find("rst_")!=string::npos){
  1000. continue;
  1001. }
  1002. //if(rs_filename.find("\\379.bmp")==string::npos){continue;}
  1003. cout<<idx<<"\t"<<rs_filename<<endl;
  1004. PositionInfo posinfo;
  1005. Mat img = imread(rs_filename,cv::IMREAD_GRAYSCALE);
  1006. image_set_top(img,20,8);
  1007. ImgInfo* rs_imginfo = mat2imginfo(img);
  1008. memset(&posinfo,0,sizeof(PositionInfo));
  1009. try{
  1010. /*if(cnter==4){
  1011. int test_tmp=0;
  1012. }*/
  1013. int fold_y = rs_cut_point(rs_imginfo, posinfo);
  1014. imginfo_release(&rs_imginfo);
  1015. for (int i =0;i<5;++i){
  1016. if (!posinfo.pp_images[i]){continue;}
  1017. Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  1018. /*imshow("pic", tmp_img);
  1019. waitKey(-1);*/
  1020. stringstream bbu;
  1021. bbu<<rs_filename<<".rst_"<<i<<".jpg";
  1022. string fnn = bbu.str();
  1023. cv::imwrite(fnn,tmp_img);
  1024. }
  1025. }
  1026. catch(exception &err){
  1027. cout<<err.what()<<endl;
  1028. }
  1029. catch(string msg){
  1030. cout<<msg<<endl;
  1031. cout<<rs_filename<<endl<<endl;
  1032. //g_logger.ERRORINFO(msg);
  1033. //g_logger.INFO(img_file);
  1034. }
  1035. catch(...){
  1036. cout<<"============================================unknown error"<<endl;
  1037. cout<<rs_filename<<endl<<endl;
  1038. }
  1039. cnter+=1;
  1040. }
  1041. cv_release();
  1042. }
  1043. void test_rs_batch_camera(){
  1044. // 0 version;
  1045. char* ver = new char[10];
  1046. get_version(ver);
  1047. cout<<ver<<endl;
  1048. delete [] ver;
  1049. ver=0;
  1050. //2 cv_init()
  1051. //char *conf_file = "D:\\private\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1052. //char *conf_file = "D:\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1053. char *conf_file = "E:\\projects\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1054. int rst = cv_init(conf_file);
  1055. ConfigParam cp_ret;
  1056. cv_get_param(cp_ret);
  1057. cv_set_loglevel(0);
  1058. cv_init_image_saver();
  1059. //cp_ret.image_show = true;
  1060. //cv_set_param(cp_ret);
  1061. //namedWindow("pic", CV_WINDOW_NORMAL);
  1062. string work_folder = "E:\\projects\\grafting_robot\\samples\\20220119\\rootstock_cut_compare";
  1063. //string work_folder = "D:\\private\\grafting_robot\\samples\\20220104\\batch";
  1064. vector<string> sub_path;
  1065. sub_path.push_back("20220119133425");
  1066. sub_path.push_back("20220119134921");
  1067. sub_path.push_back("20220119135818");
  1068. sub_path.push_back("20220119140720");
  1069. sub_path.push_back("20220119141511");
  1070. sub_path.push_back("20220119142616");
  1071. sub_path.push_back("20220119143048");
  1072. //vector<cv::String>filenames;
  1073. //cv::glob(work_folder, filenames);
  1074. vector<string> fileidx;
  1075. fileidx.push_back("3.bmp");
  1076. fileidx.push_back("11.bmp");
  1077. fileidx.push_back("19.bmp");
  1078. fileidx.push_back("27.bmp");
  1079. fileidx.push_back("35.bmp");
  1080. fileidx.push_back("43.bmp");
  1081. fileidx.push_back("51.bmp");
  1082. fileidx.push_back("59.bmp");
  1083. fileidx.push_back("67.bmp");
  1084. fileidx.push_back("75.bmp");
  1085. fileidx.push_back("83.bmp");
  1086. fileidx.push_back("91.bmp");
  1087. fileidx.push_back("99.bmp");
  1088. fileidx.push_back("107.bmp");
  1089. fileidx.push_back("115.bmp");
  1090. fileidx.push_back("123.bmp");
  1091. for(size_t idx=0; idx<sub_path.size();++idx){
  1092. string subp = sub_path[idx];
  1093. for(size_t i=0;i<fileidx.size();++i){
  1094. string rs_filename = work_folder+"\\"+subp+ "\\"+fileidx[i];
  1095. PositionInfo posinfo;
  1096. Mat img = imread(rs_filename,cv::IMREAD_GRAYSCALE);
  1097. if(img.empty()){continue;}
  1098. ImgInfo* rs_imginfo = mat2imginfo(img);
  1099. memset(&posinfo,0,sizeof(PositionInfo));
  1100. try{
  1101. int fold_y = rs_cut_point(rs_imginfo, posinfo);
  1102. imginfo_release(&rs_imginfo);
  1103. for (int i =0;i<5;++i){
  1104. if (!posinfo.pp_images[i]){continue;}
  1105. Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  1106. /*imshow("pic", tmp_img);
  1107. waitKey(-1);*/
  1108. stringstream bbu;
  1109. bbu<<rs_filename<<".rst_"<<i<<".jpg";
  1110. string fnn = bbu.str();
  1111. cv::imwrite(fnn,tmp_img);
  1112. }
  1113. }
  1114. catch(exception &err){
  1115. cout<<err.what()<<endl;
  1116. }
  1117. catch(string msg){
  1118. cout<<msg<<endl;
  1119. cout<<rs_filename<<endl<<endl;
  1120. //g_logger.ERRORINFO(msg);
  1121. //g_logger.INFO(img_file);
  1122. }
  1123. catch(...){
  1124. cout<<"============================================unknown error"<<endl;
  1125. cout<<rs_filename<<endl<<endl;
  1126. }
  1127. }
  1128. }
  1129. cv_release();
  1130. }
  1131. void test_oa_batch(){
  1132. // 0 version;
  1133. char* ver = new char[10];
  1134. get_version(ver);
  1135. cout<<ver<<endl;
  1136. delete [] ver;
  1137. ver=0;
  1138. //2 cv_init()
  1139. //char *conf_file = "D:\\private\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1140. //char *conf_file = "D:\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1141. char *conf_file = "E:\\projects\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1142. int rst = cv_init(conf_file);
  1143. ConfigParam cp_ret;
  1144. cv_get_param(cp_ret);
  1145. cv_set_loglevel(0);
  1146. cv_init_image_saver();
  1147. //cp_ret.image_show=true;
  1148. //cv_set_param(cp_ret);
  1149. //namedWindow("pic", CV_WINDOW_NORMAL);
  1150. string work_folder = "E:\\projects\\grafting_robot\\samples\\20220831\\top_cpy_sim";
  1151. //string work_folder = "D:\\private\\grafting_robot\\samples\\20220220\\rotate";
  1152. vector<cv::String>filenames;
  1153. cv::glob(work_folder, filenames);
  1154. for(size_t idx=0; idx<filenames.size();++idx){
  1155. string filename = filenames[idx];
  1156. if(filename.find(".rst_")!=string::npos){continue;}
  1157. //if(filename.find("\\249.bmp")==string::npos){continue;}
  1158. PositionInfo posinfo;
  1159. Mat img = imread(filename, cv::IMREAD_GRAYSCALE);//IMREAD_GRAYSCALE IMREAD_COLOR
  1160. if(img.empty()){continue;}
  1161. //image_set_top(img,20,8);
  1162. ImgInfo* imginfo = mat2imginfo(img);
  1163. //ImgInfo* imginfo = (ImgInfo*)(&img);
  1164. //imginfo->angle = j*30;
  1165. try{
  1166. //rs_oa_init();
  1167. //rs_oa_append(imginfo, posinfo);
  1168. rs_oa_get_result(imginfo, posinfo);
  1169. for (int i =0;i<5;++i){
  1170. if (!posinfo.pp_images[i]){continue;}
  1171. Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  1172. imshow("pic", tmp_img);
  1173. waitKey(-1);
  1174. stringstream bbu;
  1175. bbu<<filename<<".rst_"<<i<<".jpg";
  1176. string fnn = bbu.str();
  1177. cv::imwrite(fnn,tmp_img);
  1178. }
  1179. }
  1180. catch(...){
  1181. std::cout<<"some error ..."<<endl;
  1182. }
  1183. //imginfo_release(&imginfo);
  1184. }
  1185. cv_release();
  1186. }
  1187. void test_rs_batch_reid(){
  1188. // 0 version;
  1189. char* ver = new char[10];
  1190. get_version(ver);
  1191. cout<<ver<<endl;
  1192. delete [] ver;
  1193. ver=0;
  1194. //2 cv_init()
  1195. //char *conf_file = "D:\\private\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1196. //char *conf_file = "D:\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1197. char *conf_file = "E:\\projects\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1198. int rst = cv_init(conf_file);
  1199. ConfigParam cp_ret;
  1200. cv_get_param(cp_ret);
  1201. cv_set_loglevel(0);
  1202. cv_init_image_saver();
  1203. //cp_ret.image_show=true;
  1204. //cv_set_param(cp_ret);
  1205. //namedWindow("pic", CV_WINDOW_NORMAL);
  1206. string work_folder = "E:\\projects\\grafting_robot\\samples\\20221003";
  1207. //string work_folder = "D:\\private\\grafting_robot\\samples\\20220220\\rotate";
  1208. vector<cv::String>filenames;
  1209. cv::glob(work_folder, filenames);
  1210. map<string, Mat> img_cache;
  1211. for(size_t idx=0; idx<filenames.size();++idx){
  1212. if(idx %2 ==0){
  1213. continue;
  1214. }
  1215. img_cache.clear();
  1216. string filename_pre = filenames[idx-1];
  1217. string filename = filenames[idx];
  1218. if(filename_pre.find(".rst_")!=string::npos){continue;}
  1219. if(filename.find(".rst_")!=string::npos){continue;}
  1220. //if(filename.find("\\249.bmp")==string::npos){continue;}
  1221. PositionInfo posinfo;
  1222. memset(&posinfo,0,sizeof(PositionInfo));
  1223. Mat img_pre = imread(filename_pre, cv::IMREAD_GRAYSCALE);
  1224. Mat img = imread(filename, cv::IMREAD_GRAYSCALE);//IMREAD_GRAYSCALE IMREAD_COLOR
  1225. if(img_pre.empty() || img.empty()){continue;}
  1226. //image_set_top(img,20,8);
  1227. //ImgInfo* imginfo = mat2imginfo(img);
  1228. //ImgInfo* imginfo = (ImgInfo*)(&img);
  1229. //imginfo->angle = j*30;
  1230. //for DEBUG
  1231. int m_width = img.cols/2;
  1232. int m_height = img.rows/2;
  1233. cv::resize(img, img, cv::Size(m_width,m_height ));
  1234. cv::resize(img_pre, img_pre, cv::Size(m_width,m_height ));
  1235. //for DEBUG end
  1236. string imgid_pre("1");
  1237. img_cache.insert(make_pair<string, Mat>(imgid_pre,img_pre ));
  1238. try{
  1239. //rs_oa_init();
  1240. //rs_oa_append(imginfo, posinfo);
  1241. CRootStockCutPointReid rs_reid(cp_ret,0);
  1242. rs_reid.cut_point_reid(NULL,
  1243. img,
  1244. imgid_pre.c_str(),
  1245. posinfo,
  1246. img_cache);
  1247. for (int i =0;i<5;++i){
  1248. if (!posinfo.pp_images[i]){continue;}
  1249. Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  1250. imshow("pic", tmp_img);
  1251. waitKey(-1);
  1252. //stringstream bbu;
  1253. //bbu<<filename<<".rst_"<<i<<".jpg";
  1254. //string fnn = bbu.str();
  1255. //cv::imwrite(fnn,tmp_img);
  1256. }
  1257. }
  1258. catch(...){
  1259. std::cout<<"some error ..."<<endl;
  1260. }
  1261. //imginfo_release(&imginfo);
  1262. }
  1263. cv_release();
  1264. }
  1265. void test_api_batch(){
  1266. // 0 version;
  1267. char* ver = new char[10];
  1268. get_version(ver);
  1269. cout<<ver<<endl;
  1270. delete [] ver;
  1271. ver=0;
  1272. //2 cv_init()
  1273. //char *conf_file = "D:\\private\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1274. //char *conf_file = "D:\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1275. char *conf_file = "E:\\projects\\grafting_robot\\cpp_code\\demo\\demo\\gcv_conf.yml";
  1276. int rst = cv_init(conf_file);
  1277. ConfigParam cp_ret;
  1278. cv_get_param(cp_ret);
  1279. cv_set_loglevel(0);
  1280. cv_init_image_saver();
  1281. namedWindow("pic", CV_WINDOW_NORMAL);
  1282. string work_folder = "E:\\projects\\grafting_robot\\samples\\20220105\\batch2";
  1283. //string work_folder = "D:\\private\\grafting_robot\\samples\\20211215\\scion";
  1284. //string work_folder = "D:\\grafting_robot\\samples\\20220102\\batch";
  1285. for(size_t i=1;i<19;++i){
  1286. stringstream buff;
  1287. buff<<work_folder<<"\\"<<i;
  1288. //buff<<work_folder<<"\\"<<"0-4-489.bmp";
  1289. string batch_folder = buff.str();
  1290. PositionInfo posinfo;
  1291. PositionInfo posinfo_cut;
  1292. ///////////////////////////////////////////////////////
  1293. // 1 optimal angle
  1294. /*rs_oa_init();
  1295. for(size_t j=0;j<5;++j){
  1296. stringstream bf;
  1297. bf<<batch_folder<<"\\"<<2*j+1<<".bmp";
  1298. string filename = bf.str();
  1299. Mat img = imread(filename, cv::IMREAD_GRAYSCALE);
  1300. if(img.empty()){continue;}
  1301. image_set_top(img,20,8);
  1302. ImgInfo* imginfo = mat2imginfo(img);
  1303. imginfo->angle = j*30;
  1304. try{
  1305. rs_oa_append(imginfo, posinfo);
  1306. }
  1307. catch(...){
  1308. std::cout<<"some error ..."<<endl;
  1309. }
  1310. std::cout<<"angle="<<imginfo->angle<<" rootstock_width="<<posinfo.rs_oa_width<<endl;
  1311. imginfo_release(&imginfo);
  1312. for (int i =0;i<5;++i){
  1313. if (!posinfo.pp_images[i]){continue;}
  1314. Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  1315. imshow("pic", tmp_img);
  1316. waitKey(-1);
  1317. }
  1318. }
  1319. rs_oa_get_result(posinfo);
  1320. cout<<"optimal angle="<<posinfo.rs_oa<<endl;
  1321. double opt_angle = posinfo.rs_oa;*/
  1322. //////////////////////////////////////////////////////////////////
  1323. // 2 rootstock cut point
  1324. //if(!(i==4 || i==6 ||i==8 || i==12 || i==15) ){continue;}
  1325. if(i!=10){continue;}
  1326. string rs_filename = batch_folder+"\\11.bmp";
  1327. string cut_filename = batch_folder+"\\13.bmp";
  1328. /*if (i==15){
  1329. rs_filename = batch_folder+"\\11.jpg";
  1330. }*/
  1331. Mat img = imread(rs_filename,cv::IMREAD_GRAYSCALE);
  1332. image_set_top(img,20,8);
  1333. ImgInfo* rs_imginfo = mat2imginfo(img);
  1334. Mat img_cut = imread(cut_filename,cv::IMREAD_GRAYSCALE);
  1335. image_set_top(img_cut,20,8);
  1336. ImgInfo* cut_imginfo = mat2imginfo(img_cut);
  1337. clock_t t;
  1338. memset(&posinfo,0,sizeof(PositionInfo));
  1339. memset(&posinfo_cut,0,sizeof(PositionInfo));
  1340. try{
  1341. t = clock();
  1342. int fold_y = rs_cut_point(rs_imginfo, posinfo);
  1343. t = clock() - t;
  1344. imginfo_release(&rs_imginfo);
  1345. int reid = rs_cut_point_reid(cut_imginfo,posinfo.rs_img_id, posinfo_cut);
  1346. int x = posinfo_cut.rs_reid_upoint_x;
  1347. }
  1348. catch(exception &err){
  1349. cout<<err.what()<<endl;
  1350. }
  1351. catch(string msg){
  1352. cout<<msg<<endl;
  1353. cout<<rs_filename<<endl<<endl;
  1354. //g_logger.ERRORINFO(msg);
  1355. //g_logger.INFO(img_file);
  1356. }
  1357. catch(...){
  1358. cout<<"============================================unknown error"<<endl;
  1359. cout<<rs_filename<<endl<<endl;
  1360. }
  1361. //show return images
  1362. /*stringstream tu;
  1363. tu<<batch_folder<<"\\rst_"<<int(opt_angle)<<"_"<<11<<".jpg";
  1364. string tuu = tu.str();
  1365. cv::imwrite(tuu,img);*/
  1366. /*for (int i =0;i<5;++i){
  1367. if (!posinfo.pp_images[i]){continue;}
  1368. Mat tmp_img = imginfo2mat(posinfo.pp_images[i]);
  1369. imshow("pic", tmp_img);
  1370. waitKey(-1);
  1371. stringstream bbu;
  1372. bbu<<batch_folder<<"\\rst_"<<i<<".jpg";
  1373. string fnn = bbu.str();
  1374. cv::imwrite(fnn,tmp_img);
  1375. } */
  1376. cout<<"time(seconds): "<<((float)t)/CLOCKS_PER_SEC<<endl;
  1377. cout<<"\n\n";
  1378. }
  1379. cv_release();
  1380. }
  1381. void drawline_rs()
  1382. {
  1383. string rs_filename = "D:\\grafting_robot\\samples\\20220108\\rootstock\\27.jpg";
  1384. Mat img = imread(rs_filename,cv::IMREAD_GRAYSCALE);
  1385. double angle = -40.0 * 3.1415926 /180.0;
  1386. //angle =tan(angle );
  1387. int x0=259;
  1388. int y0 = 461;
  1389. int b = x0-y0;
  1390. Point p0=Point(x0,y0);
  1391. int x1 = img.cols-1;
  1392. double dx=x1-x0;
  1393. double dy = tan(angle) * dx;
  1394. if(dy<0){dy = -dy;}
  1395. int y1 = y0+(int)(dy+0.5);
  1396. Point p1 = Point(x1,y1);
  1397. int x2=0;
  1398. int y2 = x0*tan(angle )+y0;
  1399. Point p2 = Point(x2,y2);
  1400. line(img,p0,p1,Scalar(255,255,255));
  1401. line(img,p2,p1,Scalar(255,255,255));
  1402. string fnn = "./tmp27.bmp";
  1403. cv::imwrite(fnn,img);
  1404. }
  1405. void drawline_sc()
  1406. {
  1407. string rs_filename = "D:\\grafting_robot\\samples\\20220108\\rootstock\\26.jpg";
  1408. Mat img = imread(rs_filename,cv::IMREAD_GRAYSCALE);
  1409. double angle = -40.0 * 3.1415926 /180.0;
  1410. //angle =tan(angle );
  1411. int x0=395;
  1412. int y0 = 340;
  1413. int b = x0-y0;
  1414. Point p0=Point(x0,y0);
  1415. int x1 = img.cols-1;
  1416. double dx=x1-x0;
  1417. double dy = tan(angle) * dx;
  1418. if(dy<0){dy = -dy;}
  1419. int y1 = y0+(int)(dy+0.5);
  1420. Point p1 = Point(x1,y1);
  1421. int x2=0;
  1422. int y2 = x0*tan(angle )+y0;
  1423. Point p2 = Point(x2,y2);
  1424. line(img,p0,p1,Scalar(255,255,255));
  1425. line(img,p2,p1,Scalar(255,255,255));
  1426. string fnn = "./tmp26.bmp";
  1427. cv::imwrite(fnn,img);
  1428. }
  1429. void drawline_dist()
  1430. {
  1431. double x0=260.0;
  1432. double y0=292.0;
  1433. double angle = -45.0 * 3.1415926 /180.0;
  1434. double k=tan(angle );
  1435. double b = -k*260.0-435.0;
  1436. double yy = -(k*x0 +b);
  1437. double dy = yy-y0;
  1438. double r = 5.8479999999999997e-002;
  1439. double dyy = dy *r;
  1440. cout<<dy<<"\t"<<dyy;
  1441. }
  1442. int _tmain(int argc, _TCHAR* argv[])
  1443. {
  1444. //test_imginfo2mat();
  1445. //test_camconfig_write();
  1446. //test_camconfig_read();
  1447. //test_anglefit();
  1448. //test_optimal_angle();
  1449. //test_optimal_angle_simulate();
  1450. //test_optimal_angle_part();
  1451. //test_sc_cut_point();
  1452. //test_sc_cut_point_simulate();
  1453. //test_rs_cut_point();
  1454. //test_rs_cut_point_simulate();
  1455. //test_rs_cp_reid();
  1456. /////////////////////////////
  1457. //api test
  1458. //test_api_scion();
  1459. //test_sc_batch();
  1460. //test_rs_batch();
  1461. //test_rs_batch_camera();
  1462. //test_rs_batch_reid();
  1463. //test_oa_batch();
  1464. test_api_batch();
  1465. //drawline_rs();
  1466. //drawline_sc();
  1467. //drawline_dist();
  1468. //system("pause");
  1469. return 0;
  1470. }