基于基线的翻转和平移

1. 翻转

     基于基线的翻转和平移_第1张图片

        如上所示一根线,其中红色位置表示的是baseLine位置,上面是一根线baseLine不同的时候进行翻转的情况,

        代码上怎么处理,当前想到的一种比较好的方式,下面是代码片段:

        

if (bInvert != m_bInverFlag)
{
    m_bInverFlag = bInvert;
    
    int i_base_up_pt_num = iBaseLineLoc;
    int i_base_dn_pt_num = iPointNum - iBaseLineLoc;
    
    std::vector v_base_up_pts(i_base_up_pt_num, 0);
    std::vector v_base_dn_pts(i_base_dn_pt_num, 0);

    for (int i = 0; i < iLineNum; ++i)
    {
        auto p_cur_line = pu8Src + i * iPointNum;
        
        // 基线上面数据 
		memcpy(v_base_up_pts.data(), p_cur_line, v_base_up_pts.size());

        // 基线下面数据
    	memcpy(v_base_dn_pts.data(), p_cur_line + iBaseLineLoc, v_base_dn_pts.size());

		// 逆序数据
		std::reverse(v_base_up_pts.begin(), v_base_up_pts.end());
		std::reverse(v_base_dn_pts.begin(), v_base_dn_pts.end());

        std::vector v_inver_line = v_base_up_pts;
        v_inver_line.insert(v_inver_line.end(), v_base_dn_pts.begin(), v_base_dn_pts.end());

        int i_start = iBaseLineLoc + 1;
	    int i_end	= i_start + iPointNum;
		for (int i = i_start; i < i_end; ++i)
		{
			p_cur_line[i % iPointNum] = v_inver_line[i - i_start];
		}
    }
}

2. 平移

基于基线的翻转和平移_第2张图片

平移类似上图所示,在一个基线位置的基础上再进行平移处理,处理逻辑代码片段:

// 基线处理
if (iBaseLineLoc != m_iBaseLineLoc)
{
	std::vector v_tmp;
	std::vector v_src_line(iPointNum, 0);
	if (iBaseLineLoc > m_iBaseLineLoc) // 向下平移时
    {
		int i_move_size  = iBaseLineLoc - m_iBaseLineLoc;// 平移距离
		int i_data_size  = iPointNum - i_move_size;
        
        v_tmp.resize(i_move_size);
		for (int i = 0; i < iLineNum; ++i)
        {
			auto p_cur_line = pu8Src + i * iPointNum;
			memcpy(v_tmp.data(), p_cur_line + i_data_size, v_tmp.size());
			memcpy(v_src_line.data(), p_cur_line, iPointNum);
            
            memcpy(p_cur_line + i_move_size, v_src_line.data(), i_data_size);        				                    
            memcpy(p_cur_line, v_tmp.data(), v_tmp.size());
        }
    }

    else // 向上平移
	{
		int i_move_size = m_iBaseLineLoc - iBaseLineLoc;// 平移距离
		int i_data_size = iPointNum - i_move_size;
		v_tmp.resize(i_move_size);

        for (int i = 0; i < iLineNum; ++i)
		{
			auto p_cur_line = pu8Src + i * iPointNum;

			memcpy(v_tmp.data(), p_cur_line, v_tmp.size());
			memmove(p_cur_line, p_cur_line + i_move_size, i_data_size);
			memcpy(p_cur_line + i_data_size, v_tmp.data(), v_tmp.size());
		}

    }

    m_iBaseLineLoc = iBaseLineLoc;
}

 

你可能感兴趣的:(图像处理,c++,算法,数据结构)