hspscannerform.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. #include "hspscannerform.h"
  2. #include "ui_hspscannerform.h"
  3. HSPScannerForm::HSPScannerForm(QWidget *parent) :
  4. QWidget(parent),
  5. ui(new Ui::HSPScannerForm)
  6. {
  7. ui->setupUi(this);
  8. Qt::WindowFlags flags = windowFlags();
  9. this->setWindowFlags(flags | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
  10. m_ViewTimer = new QTimer(this);
  11. connect(m_ViewTimer, SIGNAL(timeout()),this,SLOT(onCamTimer()));
  12. m_bIsGrey = false;
  13. m_bIsOpen = m_bIsView = false;
  14. m_bIsHide = true;
  15. m_iRotate = 0;
  16. m_iScanSz = 0;
  17. m_iCamIdx = -1;
  18. SetPos(1080, 0, 384,216);
  19. m_dA4Pos[0] = 0.07;
  20. m_dA4Pos[1] = 0.07;
  21. m_dA4Pos[2] = 0.93;
  22. m_dA4Pos[3] = 0.93;
  23. m_dIDPos[0] = 0.35;
  24. m_dIDPos[1] = 0.35;
  25. m_dIDPos[2] = 0.65;
  26. m_dIDPos[3] = 0.65;
  27. m_iCamAll[0] = 2560;
  28. m_iCamAll[1] = 1440;
  29. }
  30. HSPScannerForm::~HSPScannerForm()
  31. {
  32. delete ui;
  33. delete m_ViewTimer;
  34. }
  35. void HSPScannerForm::SetPos(int iX, int iY, int iW, int iH)
  36. {
  37. this->move(iX, iY);
  38. ui->labViewPos->move(0, 0);
  39. this->resize(iW, iH);
  40. ui->labViewPos->resize(iW, iH);
  41. ui->labViewPos->setAlignment(Qt::AlignCenter);
  42. QPalette label_palette;
  43. label_palette.setColor(QPalette::Background, QColor(200, 200, 200));
  44. ui->labViewPos->setAutoFillBackground(true);
  45. ui->labViewPos->setPalette(label_palette);
  46. }
  47. void HSPScannerForm::SetSize(float dA4[4], float dID[4], int iAll[2])
  48. {
  49. memcpy(m_dA4Pos, dA4, sizeof(m_dA4Pos));
  50. memcpy(m_dIDPos, dID, sizeof(m_dIDPos));
  51. memcpy(m_iCamAll, iAll, sizeof(m_iCamAll));
  52. }
  53. QImage HSPScannerForm::Mat2QImage(cv::Mat cvImg)
  54. {
  55. QImage qImg;
  56. if(cvImg.channels()==3) //3 channels color image
  57. {
  58. qImg =QImage((const unsigned char*)(cvImg.data),
  59. cvImg.cols, cvImg.rows,
  60. cvImg.cols*cvImg.channels(),
  61. QImage::Format_RGB888);
  62. }
  63. else if(cvImg.channels()==1) //grayscale image
  64. {
  65. qImg =QImage((const unsigned char*)(cvImg.data),
  66. cvImg.cols,cvImg.rows,
  67. cvImg.cols*cvImg.channels(),
  68. QImage::Format_Indexed8);
  69. }
  70. else
  71. {
  72. qImg =QImage((const unsigned char*)(cvImg.data),
  73. cvImg.cols,cvImg.rows,
  74. cvImg.cols*cvImg.channels(),
  75. QImage::Format_RGB888);
  76. }
  77. return qImg.rgbSwapped();
  78. }
  79. #include "cmb.h"
  80. void HSPScannerForm::onCamTimer()
  81. {
  82. cv::Mat mMat1, mMat2;
  83. LOG4VTM(WARN, "Read Start!");
  84. m_cvCamera.read(mMat1);
  85. LOG4VTM(WARN, "Read End!");
  86. cv::Size size = mMat1.size();
  87. if (mMat1.empty())
  88. {
  89. m_cvCamera.release();
  90. m_ViewTimer->stop();
  91. m_bIsView = false;
  92. }
  93. if (m_bIsGrey)
  94. cv::cvtColor(mMat1, mMat2, cv::COLOR_RGB2GRAY);
  95. else
  96. mMat2 = mMat1;
  97. if (m_iScanSz == 0)
  98. {
  99. mMat1 = mMat2;
  100. m_Capture = mMat1;
  101. }
  102. if (m_iScanSz == 1)
  103. {
  104. cv::Rect rA4((int)(size.width * m_dA4Pos[0]), (int)(size.height * m_dA4Pos[1]),
  105. (int)(size.width * (m_dA4Pos[2] - m_dA4Pos[0])), (int)(size.height * (m_dA4Pos[3] - m_dA4Pos[1])));
  106. mMat1 = cv::Mat(cv::Size(rA4.width, rA4.height), mMat2.type());
  107. mMat2(rA4).convertTo(mMat1, mMat1.type(), 1, 0);
  108. m_Capture = mMat1;
  109. }
  110. if (m_iScanSz == 2)
  111. {
  112. cv::Rect rID((int)(size.width * m_dIDPos[0]), (int)(size.height * m_dIDPos[1]),
  113. (int)(size.width * (m_dIDPos[2] - m_dIDPos[0])), (int)(size.height * (m_dIDPos[3] - m_dIDPos[1])));
  114. m_Capture = cv::Mat(cv::Size(rID.width, rID.height), mMat2.type());
  115. mMat2(rID).convertTo(m_Capture, m_Capture.type(), 1, 0);
  116. mMat1 = mMat2;
  117. rectangle(mMat1, rID, cv::Scalar(0,255,0));
  118. }
  119. //*
  120. if (m_iRotate == 0)
  121. mMat2 = mMat1;
  122. if (m_iRotate == 1)
  123. cv::flip(mMat1.t(), mMat2, 1);
  124. if (m_iRotate == 2)
  125. cv::flip(mMat1.t(), mMat2, -1);
  126. if (m_iRotate == 3)
  127. cv::flip(mMat1.t(), mMat2, 0);
  128. // cv::rotate(mMat1, mMat2, 0);
  129. /*/
  130. mMat2 = mMat1;
  131. //*/
  132. if (this->isHidden()) return;
  133. QImage image = Mat2QImage(mMat2);
  134. QPixmap pixmap = QPixmap::fromImage(image);
  135. int iH = height();
  136. int iW = ((iH * pixmap.width()) / pixmap.height());
  137. QPixmap fiPixmap = pixmap.scaled(iW, iH, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
  138. ui->labViewPos->setPixmap(fiPixmap);
  139. }
  140. int HSPScannerForm::GetPic(const char* sFile)
  141. {
  142. if (!m_cvCamera.isOpened()) return ERR_NOT_OPENED;
  143. if (m_Capture.empty()) return ERR_VIEW_FAIL;
  144. if (cv::imwrite(sFile, m_Capture)) return 0;
  145. return ERR_VIEW_FAIL;
  146. }
  147. int HSPScannerForm::Open(const char* sID)
  148. {
  149. if (m_cvCamera.isOpened()) return 0;
  150. m_iCamIdx = GetCamIndex(sID);
  151. if (m_iCamIdx < 0) return ERR_NO_DEVICE;
  152. m_cvCamera.open(m_iCamIdx);
  153. if (m_cvCamera.isOpened())
  154. {
  155. m_cvCamera.release();
  156. m_bIsOpen = true;
  157. return 0;
  158. }
  159. m_bIsOpen = false;
  160. return ERR_OPEN_FAIL;
  161. }
  162. int HSPScannerForm::Close()
  163. {
  164. if (isVisible()) hide();
  165. if (m_cvCamera.isOpened())
  166. m_cvCamera.release();
  167. m_bIsOpen = false;
  168. return 0;
  169. }
  170. int HSPScannerForm::Preview(bool b)
  171. {
  172. if (!m_bIsOpen)
  173. return ERR_NOT_OPENED;
  174. if (b)
  175. {
  176. if (!m_cvCamera.isOpened())
  177. m_cvCamera.open(m_iCamIdx);
  178. if (!m_cvCamera.isOpened())
  179. return ERR_OPEN_FAIL;
  180. m_cvCamera.set(CV_CAP_PROP_FRAME_WIDTH, m_iCamAll[0]);
  181. m_cvCamera.set(CV_CAP_PROP_FRAME_HEIGHT, m_iCamAll[1]);
  182. double fps = m_cvCamera.get(CV_CAP_PROP_FPS);
  183. if (fps < 10) fps = 10;
  184. m_ViewTimer->start(int(1000/fps));
  185. m_bIsView = true;
  186. }
  187. else
  188. {
  189. m_bIsView = false;
  190. m_ViewTimer->stop();
  191. m_cvCamera.release();
  192. }
  193. return 0;
  194. }
  195. int HSPScannerForm::Show(bool b)
  196. {
  197. if (!m_bIsOpen)
  198. return ERR_NOT_OPENED;
  199. m_bIsHide = !b;
  200. if (b)
  201. this->show();
  202. else
  203. this->hide();
  204. return 0;
  205. }
  206. int HSPScannerForm::State()
  207. {
  208. return 0;
  209. }
  210. bool HSPScannerForm::GetVideoID(int iIndex, char* sGet)
  211. {
  212. char sTemp[128];
  213. sprintf(sTemp, "/sys/class/video4linux/video%d/device/modalias", iIndex);
  214. FILE* fp=fopen(sTemp, "r");
  215. if (fp == NULL) return false;
  216. int iLen = fread(sTemp, 1, 100, fp);
  217. sTemp[iLen]=0;
  218. fclose(fp);
  219. strcpy(sGet, sTemp);
  220. return true;
  221. }
  222. int HSPScannerForm::GetCamIndex(const char* sIn)
  223. {
  224. char sSys[128]; //usb:v04F2pB61E d0425dcE
  225. for (int ia=0; ia<10; ia++){
  226. if (GetVideoID(ia, sSys) == false) return -1;
  227. if (memcmp(sIn, sSys, strlen(sIn)) == 0) return ia;
  228. }
  229. return -1;
  230. }