demo.cpp 40 KB

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