#include "rawimage.h" #include #include RawImage::ImgType CV2Type(int cvtype) { switch (cvtype) { case CV_8U: return RawImage::UINT8; case CV_16U: return RawImage::UINT16; case CV_32F: return RawImage::FLOAT32; case CV_8UC3: return RawImage::UINT8C3; case CV_16UC3: return RawImage::UINT16C3; case CV_32FC3: return RawImage::FLOAT32C3; default: return RawImage::UNKNOWN; } } int Type2CV(RawImage::ImgType type) { switch (type) { case RawImage::UINT8: return CV_8U; case RawImage::UINT16: return CV_16U; case RawImage::FLOAT32: return CV_32F; case RawImage::UINT8C3: return CV_8UC3; case RawImage::UINT16C3: return CV_16UC3; case RawImage::FLOAT32C3: return CV_32FC3; case RawImage::UNKNOWN: return CV_8S; default: return CV_8U; } } RawImage::RawImage() { } RawImage::RawImage(int w, int h, ImgType type) { m_img.create(h, w, Type2CV(type)); } RawImage::RawImage(cv::Mat &img) { m_img = img; } RawImage::RawImage(const RawImage &d) { d.m_img.copyTo(m_img); } RawImage::RawImage(const QImage &img) { QImage tmp = img.convertToFormat(QImage::Format_RGB888); m_img.create(img.height(), img.width(), CV_8UC3); for(int i=0; i(0, i); if(medianSum >= halfImageSize) { *median = i; break; } } } return true; } void RawImage::rect(int &x, int &y, int w, int h, std::vector &r) const { r.resize(w*h); x -= w/2; y -= h/2; if(x<0)x = 0; if(y<0)y = 0; if(x+w >= m_img.cols)x = m_img.cols-w; if(y+h >= m_img.rows)y = m_img.rows-h; cv::Mat roiImg(m_img, cv::Rect(x, y, w, h)); cv::Mat doubleMat; roiImg.convertTo(doubleMat, CV_64F); r = std::vector(doubleMat.begin(), doubleMat.end()); } int RawImage::findPeaks(double background, double distance, std::vector &peaks) const { std::vector> contours; cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(distance, distance)); cv::Mat mask, dilate, locMax, result; cv::dilate(m_img, dilate, kernel); cv::compare(m_img, dilate, locMax, cv::CMP_GE); cv::compare(m_img, cv::Scalar(background), mask, cv::CMP_GT); cv::bitwise_and(locMax, mask, result); cv::findContours(result, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); peaks.reserve(contours.size()); for(auto contour : contours) { peaks.push_back(Peak(1, contour[0].x, contour[0].y)); } return peaks.size(); } RawImage* RawImage::medianFilter() const { RawImage *ret = new RawImage(); cv::medianBlur(m_img, ret->m_img, 3); return ret; } void RawImage::quarter() { } uint32_t RawImage::width() const { return m_img.cols; } uint32_t RawImage::height() const { return m_img.rows; } uint32_t RawImage::size() const { return width()*height(); } RawImage::ImgType RawImage::type() const { return CV2Type(m_img.type()); } void* RawImage::data() { return m_img.ptr(); } const void *RawImage::data() const { return m_img.ptr(); }